docker - Docker 卷对不同图像的行为不同
问题描述
我是 docker 新手,需要了解 docker 卷行为
我用 nginx 和 jenkins 得到了不同的结果
场景一:使用“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:使用 jenkins 图像
使用相同体积的 testvol
# docker run -it -v testvol:/var/jenkins_home jenkins/jenkins bash
# cd /var/jenkins_home
# ls
copy_reference_file.log newfile1 newfile2
在这里,在容器内,原始文件保存在詹金斯容器(copy_reference_file.log)中,文件从卷(newfile1,newfile2)中复制
为什么会有这种差异,或者我理解错了?
解决方案
Jenkins Docker 镜像的源代码在GitHub 上。如果你查看它的Dockerfile,它的最后一行
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/jenkins.sh"]
当你那时
docker run ... jenkinsci/jenkinsci bash
成为bash
图像的命令,作为附加参数传递给入口点,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 声明了 a
VOLUME
并且该目录上没有挂载任何其他内容,则 Docker 会创建一个新的空匿名卷。 - 如果将命名或匿名卷(但不是绑定挂载)挂载到容器中,并且该卷为空,则将映像的内容复制到卷中。
- 卷从这里开始替换容器文件系统的相应部分;对该目录的读取和写入转到卷(或绑定安装的主机目录)。
卷不是图像的“传递”;只有在第一次使用空卷时,才会将内容复制到卷中。如果您以您的示例并重新运行nginx
具有相同卷的容器,您将看到卷中copy_reference_file.log
仍然存在。
推荐阅读
- spring-boot - 如何使用 vue-cli 创建的 vuejs 将 Spring Boot 部署到 Heroku?
- python - 如果我使用自定义 dict 作为函数的全局变量,为什么我不能访问内置函数?
- go - Golang同时发送和接收udp数据包
- javascript - 使用 api 返回的 Html 进行重定向
- ruby-on-rails - 大规模更新时的 ActiveModel::Errors
- php - 使用 PHP 和 AJAX 的链表
- sql - 如何在 SQL 查询中将多条记录分组为一条
- barcode-scanner - 如何在 mc67 上对 datawedge 进行编程以在扫描条码后前进到下一个屏幕
- oozie-coordinator - Oozie 工作不在工作列表中
- ios - Ionic 3:警告:清理不安全的 URL 值