Нужно ли явно указывать WORKDIR для каждой команды в моем Dockerfile?
У меня следующая структура файла:
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, вероятно, более понятно.)
