在mkdir之后触摸文件时,构建Dockerfile失败

时间:2014-12-14 13:05:17

标签: docker dockerfile

我是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&触摸组合工作,第二个没有?

2 个答案:

答案 0 :(得分:7)

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

这样的卷映射
docker run ... -v /your/jenkins/home:/var/jenkins_home ...

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

答案 1 :(得分:5)

此问题目前已在docker/docker/issues/3639中进行了调查,并在this comment中进行了总结:

  

好的,我没有做过什么研究,似乎在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 ]]
  

在每条指令中,我们都会根据原始卷创建新卷和复制内容。

Update April 2019

  

使用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

比照。的 Build Enhancements for Docker

  

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

     
      
  • 使用buildkit创建的Docker镜像可以推送到Docker Hub和DTR,就像使用旧版本创建的Docker镜像一样
  •   
  • 适用于旧版构建的Dockerfile格式也适用于buildkit版本
  •   
  • 新的--secret命令行选项允许用户传递用于使用指定的Dockerfile构建新图像的机密信息
  •