我有一个小型 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.
看起来 /srv/jekyll 被定义为父映像中的一个卷。如果您从该映像创建容器,则该目录将不是来自该映像,而是来自创建的临时卷,从而导致意外行为。在构建期间,如果您尝试使用 RUN 命令更改该目录的内容,则随着匿名卷被清理,这些更改将在该运行命令结束时全部丢失。
我建议让该镜像的上游创建者从其 Dockerfile 中删除 VOLUME 定义,或者分叉存储库并在没有该卷的情况下构建自己的存储库。您始终可以在运行时定义卷,而无需在映像中定义卷,但是一旦在映像中定义了卷,您使用目录的能力将受到该卷的影响。
| 归档时间: |
|
| 查看次数: |
3078 次 |
| 最近记录: |