Docker卷对不同映像的行为不同

时间:2020-06-20 18:17:40

标签: docker docker-volume

我是Docker的新手,需要了解有关Docker卷行为的信息

我用nginx和jenkins得到了不同的结果

场景1:使用“ nginx”图片

# docker volume create testvol
testvol
# cd /var/lib/docker/volumes/testvol/_data/
# touch newfile1 newfile2
# ls
newfile1  newfile2

# docker run -it -v testvol:/usr/share/nginx/html nginx bash
# cd usr/share/nginx/html/
# ls
newfile1  newfile2

在这里,/ usr / share / nginx / html /下的容器内部文件是从卷(newfile1,newfile2)复制的,但是默认的nginx文件已删除(50x.html index.html)

方案2:使用詹金斯图像

使用相同体积的testvol

# docker run -it -v testvol:/var/jenkins_home jenkins/jenkins bash
# cd /var/jenkins_home
# ls
copy_reference_file.log  newfile1  newfile2

这里,在容器内部,原始文件保留在jenkins容器(copy_reference_file.log)内部,并从卷(newfile1,newfile2)复制文件

为什么会有这种区别?或者我理解错了吗?

1 个答案:

答案 0 :(得分:2)

Jenkins Docker image's source在GitHub上。如果您看一下它的Dockerfile,它的末端有一行

ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/jenkins.sh"]

那时候

docker run ... jenkinsci/jenkinsci bash

bash成为映像的命令,它得到passed as an additional parameter to the entrypoint,然后Docker运行该组合命令。 jenkins.sh脚本依次以

开头
: "${JENKINS_HOME:="/var/jenkins_home"}"
: "${COPY_REFERENCE_FILE_LOG:="${JENKINS_HOME}/copy_reference_file.log"}"
touch "${COPY_REFERENCE_FILE_LOG}"

这就是为什么在第二个示例中文件copy_reference_file.log存在。

创建容器时:

  • 如果Dockerfile声明了VOLUME且该目录上未装载任何其他内容,则Docker将创建一个新的空匿名卷。
  • 如果已将命名卷或匿名卷(但未绑定绑定卷)装入容器,并且该卷为空,则将映像内容复制到该卷中。
  • 此卷从此开始替换了容器文件系统的相应部分;对该目录的读写将转到该卷(或绑定安装的主机目录)。

体积不是图像的“通过”;内容仅在第一次使用空卷时才被复制到卷。如果以您的示例为例,并使用相同的卷重新运行nginx容器,则会看到copy_reference_file.log仍然存在于卷中。