问题

在 Dockerfile 的指令中,有一个WORKDIR 指令,我们知道它是用来设置工作目录的,但常年使用的 cd 一样好用。反正只是切换个路径,看起来也无伤大雅,对吧。

我们真的理解 WORKDIR 指令吗?

1
2
3
# Dockerfile with cd
RUN mkdir myproject && cd /myproject
RUN something?
1
2
3
# Dockerfile with WORKDIR
WORKDIR myproject
RUN something?

WORKDIR

(1) 能创建不存在的路径

WORKDIR 可以和 cd 起到同样的作用,并且更好的是在切换路径的同时如果目录不存在会自行创建

设置 WORKDIR 后的操作都会基于这个路径,同时它也可以基于相对路径不断切换 。

1
2
3
4
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

输出结果会是 /a/b/c

(2) 可以使用环境变量

WORKDIR 还可以搭配环境变量使用

1
2
3
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd

输出结果会是 /path/$DIRNAME

总结

从官方的建议来看,我们始终应该设置项目的 WORKDIR ,而不是使用 RUN cd ... && doxxx , 让 Docker 构建更易理解和维护。

扩展问题:COPYADD 有什么区别?

参考资料