2021-03-07 07:29:05 +00:00
# WORKDIR 指定工作目录
2016-11-25 18:02:43 +00:00
格式为 ` WORKDIR <工作目录路径> ` 。
2017-03-14 09:06:48 +00:00
使用 ` WORKDIR ` 指令可以来指定工作目录 ( 或者称为当前目录 ) , 以后各层的当前目录就被改为指定的目录 , 如该目录不存在 , ` WORKDIR ` 会帮你建立目录 。
2016-11-25 18:02:43 +00:00
之前提到一些初学者常犯的错误是把 ` Dockerfile ` 等同于 Shell 脚本来书写 , 这种错误的理解还可能会导致出现下面这样的错误 :
2017-11-23 15:48:52 +00:00
` ` ` docker
2016-11-25 18:02:43 +00:00
RUN cd / app
RUN echo "hello" > world . txt
` ` `
2017-11-23 15:48:52 +00:00
如果将这个 ` Dockerfile ` 进行构建镜像运行后 , 会发现找不到 ` /app/world.txt ` 文件 , 或者其内容不是 ` hello ` 。 原因其实很简单 , 在 Shell 中 , 连续两行是同一个进程执行环境 , 因此前一个命令修改的内存状态 , 会直接影响后一个命令 ; 而在 ` Dockerfile ` 中 , 这两行 ` RUN ` 命令的执行环境根本不同 , 是两个完全不同的容器 。 这就是对 ` Dockerfile ` 构建分层存储的概念不了解所导致的错误 。
2016-11-25 18:02:43 +00:00
之前说过每一个 ` RUN ` 都是启动一个容器 、 执行命令 、 然后提交存储层文件变更 。 第一层 ` RUN cd /app ` 的执行仅仅是当前进程的工作目录变更 , 一个内存上的变化而已 , 其结果不会造成任何文件变更 。 而到第二层的时候 , 启动的是一个全新的容器 , 跟第一层的容器更完全没关系 , 自然不可能继承前一层构建过程中的内存变化 。
因此如果需要改变以后各层的工作目录的位置 , 那么应该使用 ` WORKDIR ` 指令 。
2020-09-06 12:16:04 +00:00
` ` ` docker
WORKDIR / app
RUN echo "hello" > world . txt
` ` `
如果你的 ` WORKDIR ` 指令使用的相对路径 , 那么所切换的路径与之前的 ` WORKDIR ` 有关 :
` ` ` docker
WORKDIR / a
WORKDIR b
WORKDIR c
RUN pwd
` ` `
` pwd ` 输出的结果为 ` /a/b/c ` 。