9

我是 Docker 新手,并尝试使用简单的 Dockerfile 构建映像:

FROM jenkins
USER root
RUN mkdir -pv /home/a/b
RUN touch /home/a/b/test.txt
RUN mkdir -pv /var/jenkins_home/a/b
RUN touch /var/jenkins_home/a/b/test.txt
USER jenkins

当我构建它时,它失败并显示以下输出:

Step 0 : FROM jenkins
Step 1 : USER root
Step 2 : RUN mkdir -pv /home/a/b
  mkdir: created directory '/home/a'
  mkdir: created directory '/home/a/b'
Step 3 : RUN touch /home/a/b/test.txt
Step 4 : RUN mkdir -pv /var/jenkins_home/a/b
  mkdir: created directory '/var/jenkins_home/a'
  mkdir: created directory '/var/jenkins_home/a/b'
Step 5 : RUN touch /var/jenkins_home/a/b/test.txt
  touch: cannot touch '/var/jenkins_home/a/b/test.txt': No such file or directory

谁能告诉我,我在这里缺少什么?为什么第一个 mkdir & touch 组合有效而第二个无效?

4

2 回答 2

7

查看https://registry.hub.docker.com/u/library/jenkins/,似乎 /var/jenkins_home 是一个卷。您只能在容器运行时在那里创建文件,大概使用卷映射,例如

docker run ... -v /your/jenkins/home:/var/jenkins_home ...

docker build 过程对共享卷一无所知。

于 2014-12-14T14:17:34.700 回答
6

目前在docker/docker/issues/3639对此进行了调查,并在此评论中进行了总结:

好的,我做了很少的研究,似乎卷在 Dockerfile 指令之间是不可变的
这里甚至更小的 Dockerfile 用于测试:

FROM busybox

RUN mkdir /tmp/volume
RUN echo "hello" > /tmp/volume/hello
VOLUME ["/tmp/volume/"]
RUN [[ -f /tmp/volume/hello ]]
RUN rm /tmp/volume/hello
RUN [[ ! -e /tmp/volume/hello ]]

在每条指令上,我们都会创建新卷并从原始卷复制内容

2019 年 4 月更新

使用DOCKER_BUILDKIT=1
新的构建器不会出现这种行为。

示例来自dominikzalewski

https://user-images.githubusercontent.com/13519572/55938628-13b60580-5c3c-11e9-8096-9ab860198920.png

这是我正在使用的一个非常简单的 Dockerfile:

FROM wordpress:latest
ARG UPLOAD_DIR=/var/www/html/wp-content/uploads

RUN mkdir -p $UPLOAD_DIR
RUN ls -lhd $UPLOAD_DIR

参照。为 Docker 构建增强功能

18.09 版本的 Docker Build 增强功能引入了对构建架构的急需检修。
通过集成 BuildKit,用户应该会看到性能、存储管理、特性功能和安全性方面的改进。

  • 使用 buildkit 创建的 Docker 镜像可以推送到 Docker Hub 和 DTR,就像使用传统构建创建的 Docker 镜像一样
  • 适用于旧版构建的 Dockerfile 格式也适用于 buildkit 构建
  • 新的--secret命令行选项允许用户传递秘密信息以使用指定的 Dockerfile 构建新图像
于 2015-07-13T13:35:04.367 回答