我希望将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
Run Code Online (Sandbox Code Playgroud)
...建筑...看起来不错吗?
Step 12 : RUN mkdir -p /home/jenkins/.ssh && touch /home/jenkins/.ssh/aFile
---> Running in ca19a679580d
---> 5980df7db482
Removing intermediate container ca19a679580d
Successfully built 5980df7db482
Run Code Online (Sandbox Code Playgroud)
跑来跑去,周围没有.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:~#
Run Code Online (Sandbox Code Playgroud)
如果我拉出父图像,jenkinsci/jnlp-slave并使用进行检查,则docker inspect jenkinsci/jnlp-slave可以看到它已经具有定义在/home/jenkins以下位置的体积:
[
{
...
"ContainerConfig": {
...
"Volumes": {
"/home/jenkins": {}
},
...
}
]
Run Code Online (Sandbox Code Playgroud)
这意味着在每个构建步骤中,您对该位置所做的任何更改都不会提交到新层。
这是Dockerfile的简化版本,以突出显示正在发生的事情:
FROM jenkinsci/jnlp-slave
RUN mkdir -p /home/jenkins/.ssh
Run Code Online (Sandbox Code Playgroud)
现在,让我们使用以下命令进行构建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
Run Code Online (Sandbox Code Playgroud)
该--no-cache选项使命令在重复调用时更易于使用。这--rm=false将导致构建器无法删除为每个步骤创建的容器。
在这种情况下,构建器在我的系统上运行了520a8e2f7cae中的步骤2。现在,我可以做一个docker inspect 520a8e2f7cae并查看用于此步骤的实际容器。具体来说,我对安装位置感到好奇:
[
{
...
"Mounts": [
{
"Name": "e34fd82bd190f21dbd63b5cf70167a16674cd00d95fdc6159314c25c6d08e10e",
"Source": "/var/lib/docker/volumes/e34fd82bd190f21dbd63b5cf70167a16674cd00d95fdc6159314c25c6d08e10e/_data",
"Destination": "/home/jenkins",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
}
]
Run Code Online (Sandbox Code Playgroud)
我看到有一个ID e34fd82bd190f21dbd63b5cf70167a16674cd00d95fdc6159314c25c6d08e10e为的匿名卷/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 Code Online (Sandbox Code Playgroud)
.ssh在RUN步骤中创建的目录在此卷中。由于卷不属于容器的写入层,因此不会提交。我可以通过docker diff在此容器上执行以下操作来确认这一点:
docker diff 520a8e2f7cae
Run Code Online (Sandbox Code Playgroud)
没有输出,表示对容器的文件系统没有任何更改,这就是为什么它不进入映像的这一层的原因。
此位置上的其他内容是父映像中的文件,这些文件是在成为卷的VOLUME指令之前提交的/home/jenkins。
| 归档时间: |
|
| 查看次数: |
874 次 |
| 最近记录: |