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

如果在Dockerfile中进行了更改,Docker是否会在装载时更新卷的内容?,docker,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 ${JENKIN

我让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
没有创建。为什么会这样?

基本上当你跑步时:

docker run -v /host-src-dir:/container-dest-dir my_image
您将用
/host src dir
中的内容覆盖您的
/container dest dir

此命令将主机目录/src/webapp装载到 容器位于/webapp。如果路径/webapp已存在于 容器的映像,/src/webapp装载覆盖,但不删除 预先存在的内容。卸下装载后,内容将被删除 再次访问。这与用户的预期行为一致 挂载命令

所以这个问题也是相关的

看起来您想要的是另一种方式(即容器是源,主机是目标)

以下是一个解决方法:

  • 在Dockerfile中创建卷

  • 不使用
    -v
    运行它,即:
    docker运行--name=my_container my_image

  • 运行
    docker-inspect--format='{{json.Mounts}}'我的容器

  • 这将为您提供类似以下内容的输出:

  • 这意味着容器上的目录已装入主机目录
    /var/lib/docker/volumes/5e2d41896b9b1b0d7bc0b4ad6dfe3f926c73/_data


    不幸的是,我不知道如何将其装载到特定的主机目录上。

    如果目录成功构建,您是否尝试在容器内部进行监视?是否确实正确重建了容器?构建过程中是否有任何错误?e、 g.由于目录不存在,无法复制文件?运行
    docker build
    命令以完成ok;生成过程中未报告任何错误。你说在容器里看是什么意思?我已经运行了
    docker exec-it jenkins/bin/bash
    ,发现容器中没有名为
    .m2
    的目录。请尝试在没有变量dir名称的情况下运行cp。运行mkdir/.m2 COPY settings.xml/.m2/settings.xmlNo,这没有帮助。但是,如果在运行容器之前存在主机目录
    /var/jenkins_home/.m2
    ,则会在其中创建文件
    settings.xml
    。确定,问题是如果将主机目录装入容器,则主机目录的内容会覆盖容器的目录。我刚才的评论是错误的-我在容器中看到
    settings.xml
    文件的原因是我使用了错误的
    -v
    开关,这意味着卷没有正确装入,从而确保容器的
    settings.xml
    文件可见。
    $ docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py