How to Change Directory in Docker – 如何在Docker中改变目录

最后修改: 2022年 9月 3日

1. Overview


Docker images comprise a set of sequential instructions that serve as a template to build a container. In this tutorial, we’ll learn how to change the directory when building a Docker image or when running a container using an image.


2. Using the WORKDIR Instruction


First, let’s start by spawning a Docker container using the readily available ubuntu:latest image:


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

We can see that as soon as the container is up, the current directory is set as /.


Next, let’s say we want to change this directory to /tmp at container startup. We can do this by using the WORKDIR instruction inside a custom image that uses the ubuntu:latest as the base image:


$ cat custom-ubuntu-v1.dockerfile
FROM ubuntu:latest

Before we can run a container using this image, we’ll need to build the image. So, let’s go ahead and build the custom-ubuntu:v1 image:


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

Finally, let’s run a container using the custom-ubuntu:v1 image and verify the current directory:


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

It looks like we’ve got this right!


3. Using the –workdir Option


Using the WORKDIR instruction is the recommended practice for most cases where we want to change the directory when building the Docker image. Nevertheless, if our use case is limited to changing the directory when running the container, then we can achieve this by using the –workdir option:


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

Looking at this, we can appreciate the command’s brevity and the fact that we didn’t have to create a custom image in this case.


4. Using the cd Command


In Linux, the cd command is the standard way to change the directory for most use cases. On the same note, when working with some docker instructions such as RUN, CMD, and ENTRYPOINT, we can use the cd command to change the directory for the current command in context.


Let’s start by writing the custom-ubuntu-v2.dockerfile to use the RUN  instruction with the cd command:


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

We can see that the intention is to write “sample text” to the /tmp/data.txt file.

我们可以看到,其意图是将 “样本文本 “写入/tmp/data.txt文件。

Next, let’s add the ENTRYPOINT instruction to run bash as the default command on container startup. Additionally, we use the cd command to change the current directory to the /tmp directory:


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

Moving on, let’s build the custom image:


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

Finally, let’s run the container using the custom-ubuntu:v2 image and verify the execution of the commands:


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

We can see that the results of both the change directory commands are as expected. Additionally, we must remember that WORKDIR remains the recommended way. Still, for simple use cases, we can use the cd command in conjunction with the RUN, ENTRYPOINT, or the CMD instructions.


5. Conclusion


In this article, we learned different approaches to changing the directory when working with Docker images or starting the container.