1. 概述
Docker 镜像是由一系列顺序执行的指令组成的,可以作为构建容器的模板。在本教程中,我们将学习在构建 Docker 镜像时或使用镜像启动容器时,如何切换目录。
2. 使用 WORKDIR
指令
首先,我们可以通过官方的 ubuntu:latest
镜像启动一个容器:
$ docker run -it ubuntu:latest
root@89848b34daa6:/# pwd
/
可以看到,容器启动后当前目录默认是根目录 /
。
如果我们希望容器启动时默认进入 /tmp
目录,可以使用 WORKDIR
指令,创建一个基于 ubuntu:latest
的自定义镜像:
FROM ubuntu:latest
WORKDIR /tmp
保存为 custom-ubuntu-v1.dockerfile
,然后构建镜像:
$ docker build -t custom-ubuntu:v1 - < ./custom-ubuntu-v1.dockerfile
接着运行容器并验证当前目录:
$ docker run -it custom-ubuntu:v1
root@4c26093b26e6:/tmp# pwd
/tmp
✅ 成功切换目录到 /tmp
。
3. 使用 --workdir
参数
使用 WORKDIR
指令是构建镜像时推荐的做法。但如果我们只是想在运行容器时切换目录,可以使用 docker run
命令的 --workdir
参数,无需构建新镜像:
$ docker run --workdir /tmp -it ubuntu:latest
root@32c5533c248c:/tmp# pwd
/tmp
✅ 简洁有效,适合临时使用场景。
4. 使用 cd
命令
在 Linux 中,cd
命令是切换目录的标准方式。在 Docker 的 RUN
、CMD
、ENTRYPOINT
等指令中,也可以结合使用 cd
来切换当前命令执行的目录。
举个例子,创建 custom-ubuntu-v2.dockerfile
:
FROM ubuntu:latest
RUN cd /tmp && echo "sample text" > data.txt
这个指令的目的是在 /tmp
目录下创建一个 data.txt
文件。
再添加 ENTRYPOINT
,让容器启动时自动进入 /tmp
目录:
ENTRYPOINT ["sh", "-c", "cd /tmp && bash"]
构建镜像:
$ docker build -t custom-ubuntu:v2 - < ./custom-ubuntu-v2.dockerfile
运行容器并验证:
$ docker run -it custom-ubuntu:v2
root@2731e50ea20a:/tmp# pwd
/tmp
root@2731e50ea20a:/tmp# cat /tmp/data.txt
sample text
✅ 成功执行了 cd
命令并切换目录。
⚠️ 但要注意,**WORKDIR
是更推荐的方式**,因为 cd
在某些上下文中容易失效,比如多层 RUN
指令之间不会保留当前目录。
5. 总结
在本教程中,我们学习了三种在 Docker 中切换目录的方法:
- ✅
WORKDIR
:推荐做法,用于构建镜像时设置默认工作目录 - ✅
--workdir
:运行容器时临时切换目录,无需构建新镜像 - ✅
cd
命令:适用于RUN
、CMD
、ENTRYPOINT
中执行命令时切换目录,但需注意作用域
选择哪种方式取决于你的使用场景和是否需要持久化配置。在实际开发中,建议优先使用 WORKDIR
,确保目录切换清晰、可维护。