是否有必要在我的 Dockerfile 中为每个命令显式指示 WORKDIR?

Is it necessary to explicitly indicate the WORKDIR for each command in my 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 的 right-hand 侧使用绝对路径,那么它会使用容器中的绝对路径。如果您使用相对路径,那么它是相对于当前 WORKDIR。在你的 Dockerfile 中你有一个绝对路径 /src 所以这是目的地,但是如果你将它更改为相对路径

COPY ./src/ ./src/

它将在当前WORKDIR下。

我建议在 COPY 的 right-hand 一侧尽可能避免使用路径和文件名;例如你也可以 COPY requirements.txt ./.

COPY 的 left-hand 端的规则有点不同:所有领先的 .. 路径组件都被剥离,然后不管它是绝对路径还是相对路径解释为 build-context 目录下的路径。因此,即使源代码看起来像绝对路径,它也经常被解释为相对于 Dockerfile 的路径。同样,在 left-hand 侧使用相对路径 COPY 可能更清楚。)