Нужно ли явно указывать WORKDIR для каждой команды в моем Dockerfile?

У меня следующая структура файла:

enter image description here

Dockerfile:

# syntax=docker/dockerfile:1

FROM python:3.8-slim-buster

WORKDIR /home/pos

COPY requirements.txt requirements.txt

RUN pip3 install -r requirements.txt

COPY /src /src
    
CMD ["python", "src/manage.py", "runserver"]

Я ожидаю, что содержимое папки src/ будет скопировано в тот же путь в контейнере (home/pos/src/), но только requirements.txt копируется в этот путь, содержимое папки /src копируется в "корень" (/), поэтому мне нужно изменить команду на:

COPY /src /home/pos/src

Необходимо ли задавать WORKDIR для каждой команды?

Если вы используете абсолютный путь в правой части COPY, то он использует абсолютный путь в контейнере. Если вы используете относительный путь, то он будет относительным по отношению к текущему WORKDIR. В вашем Dockerfile указан абсолютный путь /src, поэтому это место назначения, но если вы измените его на относительный путь

COPY ./src/ ./src/

он будет находиться под текущим WORKDIR.

Я бы предложил избегать как можно больше путей и имен файлов в правой части COPY; например, вы можете также COPY requirements.txt ./.

(Правила для левой части COPY немного отличаются: все ведущие компоненты пути .. обрезаются, затем, независимо от того, абсолютный это путь или относительный, он интерпретируется как путь под каталогом контекста сборки. Таким образом, даже если источник выглядит как абсолютный путь, он часто интерпретируется как путь относительно Docker-файла. Опять же, использование относительного пути в левой части COPY, вероятно, более понятно.)

Вернуться на верх