mkdir .ssh在Dockerfile中,文件夹不在吗?

我想我的Dockerfile mkdir .ssh /
但它不,为什么不呢?

FROM jenkinsci/jnlp-slave MAINTAINER Johnny5 isAlive <johnny5@hotmail.com> USER root RUN rm /bin/sh && ln -s /bin/bash /bin/sh RUN apt-get update RUN apt-get install unzip git curl vim -y USER jenkins RUN mkdir -p /home/jenkins/.ssh && touch /home/jenkins/.ssh/aFile 

…build筑…看起来不错?

 Step 12 : RUN mkdir -p /home/jenkins/.ssh && touch /home/jenkins/.ssh/aFile ---> Running in ca19a679580d ---> 5980df7db482 Removing intermediate container ca19a679580d Successfully built 5980df7db482 

运行并环顾四周,.ssh /文件夹和aFile里面没有…

 $ docker run -it -u 0 --entrypoint /bin/bash 5980df7db482 root@4aa40a18baf2:~# pwd /home/jenkins root@4aa40a18baf2:~# ls -al total 24 drwxr-xr-x 3 jenkins jenkins 4096 Oct 17 23:17 . drwxr-xr-x 4 root root 4096 Sep 14 08:50 .. -rw-r--r-- 1 jenkins jenkins 220 Nov 12 2014 .bash_logout -rw-r--r-- 1 jenkins jenkins 3515 Nov 12 2014 .bashrc -rw-r--r-- 1 jenkins jenkins 675 Nov 12 2014 .profile drwxr-xr-x 2 jenkins jenkins 4096 Sep 14 08:50 .tmp root@4aa40a18baf2:~# 

如果我拉的父图像, jenkinsci/jnlp-slave ,并检查与docker inspect jenkinsci/jnlp-slave ,我可以看到它已经有一个定义在/home/jenkins

 [ { ... "ContainerConfig": { ... "Volumes": { "/home/jenkins": {} }, ... } ] 

这意味着在每个构build步骤中,您对该位置所做的任何更改都不会被提交到新图层。

以下是Dockerfile的简化版本,以突出显示正在发生的事情:

 FROM jenkinsci/jnlp-slave RUN mkdir -p /home/jenkins/.ssh 

现在,让我们用以下命令docker build --no-cache --rm=false -t jns .docker build --no-cache --rm=false -t jns .

 Sending build context to Docker daemon 2.56 kB Step 1 : FROM jenkinsci/jnlp-slave ---> d7731d944ad7 Step 2 : RUN mkdir -p /home/jenkins/.ssh ---> Running in 520a8e2f7cae ---> 962189878d5e Successfully built 962189878d5e 

--no-cache选项使命令更容易与重复调用一起使用。 --rm=false将导致构build器不删除为每个步骤创build的容器。

在这种情况下,构build器在我的系统上运行520a8e2f7cae中的第2步。 我现在可以做一个docker inspect 520a8e2f7cae ,看看这个步骤使用的实际容器 。 具体来说,我很好奇坐骑的位置:

 [ { ... "Mounts": [ { "Name": "e34fd82bd190f21dbd63b5cf70167a16674cd00d95fdc6159314c25c6d08e10e", "Source": "/var/lib/docker/volumes/e34fd82bd190f21dbd63b5cf70167a16674cd00d95fdc6159314c25c6d08e10e/_data", "Destination": "/home/jenkins", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], ... } ] 

我看到有一个匿名卷,用于/home/jenkins ID为/home/jenkins

我可以像这样检查该卷的内容:

 $ docker run --rm -v e34fd82bd190f21dbd63b5cf70167a16674cd00d95fdc6159314c25c6d08e10e:/volume alpine ls -lah /volume total 28 drwxr-xr-x 4 10000 10000 4.0K Oct 18 02:49 . drwxr-xr-x 25 root root 4.0K Oct 18 02:55 .. -rw-r--r-- 1 10000 10000 220 Nov 12 2014 .bash_logout -rw-r--r-- 1 10000 10000 3.4K Nov 12 2014 .bashrc -rw-r--r-- 1 10000 10000 675 Nov 12 2014 .profile drwxr-xr-x 2 10000 10000 4.0K Oct 18 02:49 .ssh drwxr-xr-x 2 10000 10000 4.0K Sep 14 08:50 .tmp 

RUN步骤中创build的.ssh目录位于此卷中。 由于卷不是容器的写入层的一部分,因此它不会被提交。 我可以通过在这个容器上执行一个docker diff来确认:

 docker diff 520a8e2f7cae 

没有输出,显示没有改变容器的文件系统,这就是为什么它不会出现在图像的这一层。

这个位置的其他内容是父映像中的文件,这些文件是在/home/jenkins成为卷的VOLUME指令之前提交的。