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 的 RUNCMDENTRYPOINT 等指令中,也可以结合使用 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 命令:适用于 RUNCMDENTRYPOINT 中执行命令时切换目录,但需注意作用域

选择哪种方式取决于你的使用场景和是否需要持久化配置。在实际开发中,建议优先使用 WORKDIR,确保目录切换清晰、可维护。


原始标题:How to Change Directory in Docker