Docker Tip #46: Using WORKDIR to Cleanup Your Dockerfile

If you find yourself frequently changing directories in your Dockerfile then you may want to look into using WORKDIR. Here's how.
The WORKDIR instruction allows you to set a specific path in one spot,
and then most instructions (RUN and COPY to name a few) will execute
in the context of that WORKDIR.
Let’s say this were your old Dockerfile that didn’t use WORKDIR:
FROM python:3.8.3-slim-buster
RUN mkdir /app
COPY requirements.txt /app/requirements.txt
RUN cd /app && pip install -r requirements.txt
COPY . /app
CMD ["gunicorn", "-c", "python:config.gunicorn", "foo.app:create_app()"]
Yikes, you had to repeat the /app path in so many spots.
You can drastically improve the above Dockerfile by leveraging WORKDIR:
FROM python:3.8.3-slim-buster
# We don't even need to run mkdir /app since WORKDIR will make it for us.
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "-c", "python:config.gunicorn", "foo.app:create_app()"]
The key there is setting WORKDIR /app. Everything after that point will
execute from the /app directory.
You can think of it as doing a cd but the directory you change into will
persist between instructions. You can even have more than 1 WORKDIR in your
Dockerfile if you need it.
Here’s an example of using multiple WORKDIRs:
WORKDIR /foo/bar
WORKDIR baz
RUN pwd
The above pwd command would resolve to /foo/bar/baz.