如果在Dockerfile中进行了更改,Docker会在挂载时更新卷的内容吗?

时间:2017-05-23 08:24:51

标签: docker

我让Jenkins在Docker容器中运行。主目录位于主机卷中,以确保在对容器进行更新时保留构建历史记录。

我更新了容器,在主目录中创建了一个附加文件。拉出新容器时,我看不到更改的文件。

ENV JENKINS_HOME=/var/jenkins_home
RUN mkdir -p ${JENKINS_HOME}/.m2
COPY settings.xml ${JENKINS_HOME}/.m2/settings.xml
RUN chown -R jenkins:jenkins ${JENKINS_HOME}/.m2
VOLUME ["/var/jenkins_home"]

我正在运行这样的容器:

docker run -v /host/directory:/var/jenkins_home -p 80:8080 jenkins

我之前运行过Jenkins,因此主机上已存在主目录。当我拉新容器并运行它时,我发现文件.m2/settings.xml未创建。为什么这样呢?

1 个答案:

答案 0 :(得分:1)

基本上当你跑步时:

docker run -v /host-src-dir:/container-dest-dir my_image

您会将/container-dest-dir/host-src-dir

中的内容叠加在一起

来自Docs

$ docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py
     

此命令将主机目录/ src / webapp安装到   容器at / webapp。如果路径/ webapp已经存在于   容器的图像,/ src / webapp挂载覆盖但不删除   预先存在的内容。删除安装后,内容就是   再次访问。这符合预期的行为   mount命令。

此SO问题也与docker mounting volumes on host

相关

似乎你想要反过来(即容器是源,主机是目的地)。

这是一种解决方法:

  1. 在Dockerfile中创建卷

  2. 在没有-v的情况下运行它,即:docker run --name=my_container my_image

  3. 运行docker inspect --format='{{json .Mounts}}' my_container

  4. 这将为您提供类似于:

  5. 的输出

    [{"Name":"5e2d41896b9b1b0d7bc0b4ad6dfe3f926c73","Source":"/var/lib/docker/volumes/5e2d41896b9b1b0d7bc0b4ad6dfe3f926c73/_data","Destination":"/var/jenkins_home","Driver":"local","Mode":"","RW":true,"Propagation":""}]

    这意味着您在容器上的目录已安装到主目录/var/lib/docker/volumes/5e2d41896b9b1b0d7bc0b4ad6dfe3f926c73/_data

    不幸的是,我不知道如何让它安装在特定的主机目录上。