多阶段 Docker 构建 COPY 失败,找不到文件

Fol*_*und 5 jekyll docker

我有一个小型 Jekyll 站点的多级 Dockerfile。

Dockerfile:

FROM jekyll/minimal AS build

COPY . /srv/jekyll

RUN jekyll build

FROM pierrezemb/gostatic

COPY --from=build /srv/jekyll/_site /srv/http
Run Code Online (Sandbox Code Playgroud)

Docker 在最后阶段失败,出现以下错误:

Step 5/5 : COPY --from=build /srv/jekyll/_site /srv/http
COPY failed: stat /var/lib/docker/overlay2/e6b407b63b9578dd7ae4ccba968fff3f4e28e35e50e887c09319b32ccd548356/merged/srv/jekyll/_site: no such file or directory
Run Code Online (Sandbox Code Playgroud)

如果我将第二个 FROM 删除并exec放入构建容器中,我可以看到这些文件存在于/srv/jekyll/_site.

BMi*_*tch 2

看起来 /srv/jekyll 被定义为父映像中的一个卷。如果您从该映像创建容器,则该目录将不是来自该映像,而是来自创建的临时卷,从而导致意外行为。在构建期间,如果您尝试使用 RUN 命令更改该目录的内容,则随着匿名卷被清理,这些更改将在该运行命令结束时全部丢失。

我建议让该镜像的上游创建者从其 Dockerfile 中删除 VOLUME 定义,或者分叉存储库并在没有该卷的情况下构建自己的存储库。您始终可以在运行时定义卷,而无需在映像中定义卷,但是一旦在映像中定义了卷,您使用目录的能力将受到该卷的影响。