我是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)复制文件
为什么会有这种区别?或者我理解错了吗?
答案 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
存在。
创建容器时:
VOLUME
且该目录上未装载任何其他内容,则Docker将创建一个新的空匿名卷。体积不是图像的“通过”;内容仅在第一次使用空卷时才被复制到卷。如果以您的示例为例,并使用相同的卷重新运行nginx
容器,则会看到copy_reference_file.log
仍然存在于卷中。