Dockerfile 中的卷更改

Dockerfile 中的卷更改

我有以下Dockerfile:

FROM jenkins/jenkins:lts
SHELL ["/bin/bash", "-c"]
ENV PROJECT_NAME Jira
ENV PROJECT_GIT_URL some_link_to_repo
COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
COPY custom-template.groovy /usr/share/jenkins/ref/init.groovy.d/
COPY ldap-config-template.groovy /usr/share/jenkins/ref/init.groovy.d/
COPY job-dsl-template.groovy /var/jenkins_home/dsl/
COPY id_rsa /tmp/
USER root
RUN apt-get update ;\
    apt-get -y install gettext-base ;\
    cat /var/jenkins_home/dsl/job-dsl-template.groovy | envsubst > /var/jenkins_home/dsl/job-dsl.groovy ;\
    rm -v /var/jenkins_home/dsl/job-dsl-template.groovy
USER jenkins
#RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt

其中jenkins/jenkins:lts有一个卷安装在 中/var/jenkins_home

命令

cat /var/jenkins_home/dsl/job-dsl-template.groovy | envsubst > /var/jenkins_home/dsl/job-dsl.groovy ;\

rm -v /var/jenkins_home/dsl/job-dsl-template.groovy

/var/jenkins_home看起来像是在构建期间执行的,但是之后我没有看到对卷所做的更改。

文件

/var/jenkins_home/dsl/job-dsl.groovy未创建

/var/jenkins_home/dsl/job-dsl-template.groovy没有被删除,为什么?

看起来在卷上构建 docker 镜像期间所做的每个更改在构建后都会被遗忘。

答案1

这种行为是预期的在 stackexchange 上的这个答案中描述。您有以下选择:

  1. 破解 Docker 不支持的图像元数据,当您从上游拉取下一个更新时它将被覆盖。
  2. 获取上游以从其图像中删除卷。
  3. 从 Dockerfile 中删除 VOLUME 行,并根据上游 repo 构建新镜像。

具体来说,对于 Jenkins,他们已经实现了自己的解决方案,即/usr/share/jenkins/ref/在首次启动时复制到 JENKINS_HOME 的目录。因此,您的镜像需要修改此文件夹,而不是直接修改文件夹。您将看到使用各种脚本(如和)/var/jenkins_home完成此操作。install-plugins.shjenkins-support

相关内容