我是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
Run Code Online (Sandbox Code Playgroud)
当我构建它时,它失败并输出以下内容:
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
Run Code Online (Sandbox Code Playgroud)
谁能告诉我,我在这里缺少什么?为什么第一个mkdir和touch组合工作而第二个没有?
看看https://registry.hub.docker.com/u/library/jenkins/,似乎/ var/jenkins_home是一个卷.您只能在容器运行时在那里创建文件,大概可以使用像这样的卷映射
docker run ... -v /your/jenkins/home:/var/jenkins_home ...
Run Code Online (Sandbox Code Playgroud)
docker构建过程对共享卷一无所知.
目前在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 ]]
Run Code Online (Sandbox Code Playgroud)
在每条指令上,我们从原始卷创建新卷和复制内容.
| 归档时间: |
|
| 查看次数: |
6862 次 |
| 最近记录: |