docker_practice/image/dockerfile/workdir.md
Kang Huaishuai ea00e0d82a
Update format
Signed-off-by: Kang Huaishuai <khs1994@khs1994.com>
2021-03-07 15:29:05 +08:00

37 lines
1.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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