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
命令是更改目录的常用方法。类似地,在使用RUN
、CMD
和ENTRYPOINT
等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
仍然是首选方式。对于简单的用例,我们可以在RUN
、ENTRYPOINT
或CMD
指令中结合使用cd
命令。
5. 总结
在这篇文章中,我们了解了在处理Docker镜像或启动容器时改变目录的不同方法。