1. 概述

Docker镜像是一系列有序的指令,它们作为构建容器的模板。在这个教程中,我们将学习如何在构建Docker镜像或使用镜像运行容器时更改目录。

2. 使用WORKDIR指令

首先,我们使用现成的ubuntu:latest 镜像启动一个Docker容器:

$ docker run -it ubuntu:latest
root@89848b34daa6:/# pwd
/

可以看到,容器一启动,当前目录就被设置为/

假设我们想在容器启动时将目录更改为/tmp。我们可以在基于ubuntu:latest基础镜像的自定义镜像中使用WORKDIR指令来实现:

$ cat custom-ubuntu-v1.dockerfile
FROM ubuntu:latest
WORKDIR /tmp

在使用这个镜像运行容器之前,我们需要先构建它。现在,让我们构建custom-ubuntu:v1镜像:

$ docker build -t custom-ubuntu:v1 - < ./custom-ubuntu-v1.dockerfile

最后,我们使用custom-ubuntu:v1镜像运行一个容器,并验证当前目录:

$ docker run -it custom-ubuntu:v1
root@4c26093b26e6:/tmp# pwd
/tmp

看起来一切正常!

3. 使用--workdir选项

对于大多数想要在构建Docker镜像时更改目录的情况,使用WORKDIR指令是推荐的做法。然而,如果我们的情况仅限于在运行容器时更改目录,那么可以通过使用--workdir选项来实现:

$ docker run --workdir /tmp -it ubuntu:latest
root@32c5533c248c:/tmp# pwd
/tmp

通过这种方式,我们可以欣赏到命令的简洁性,而且在这种情况下,我们不需要创建自定义镜像。

4. 使用cd命令

在Linux中,cd命令是更改目录的常用方法。类似地,在使用RUNCMDENTRYPOINT等Docker指令时,我们也可以使用cd命令来更改上下文中的当前命令目录。

首先,我们编写custom-ubuntu-v2.dockerfile,在RUN指令中使用cd命令:

FROM ubuntu:latest
RUN cd /tmp && echo "sample text" > data.txt

目的是将“sample text”写入/tmp/data.txt文件。

接下来,我们在ENTRYPOINT指令中添加bash,使其成为容器启动时的默认命令,并使用cd命令将当前目录切换到/tmp目录:

ENTRYPOINT ["sh", "-c", "cd /tmp && bash"]

然后,我们构建自定义镜像:

$ docker build -t custom-ubuntu:v2 - < ./custom-ubuntu-v2.dockerfile

最后,使用custom-ubuntu:v2镜像运行容器,验证命令执行:

$ docker run -it custom-ubuntu:v2
root@2731e50ea20a:/tmp# pwd
/tmp
root@2731e50ea20a:/tmp# cat /tmp/data.txt
random text

我们可以看到,更改目录的命令结果符合预期。但必须记住,WORKDIR仍然是首选方式。对于简单的用例,我们可以在RUNENTRYPOINTCMD指令中结合使用cd命令。

5. 总结

在这篇文章中,我们了解了在处理Docker镜像或启动容器时改变目录的不同方法