我有以下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 上的这个答案中描述。您有以下选择:
- 破解 Docker 不支持的图像元数据,当您从上游拉取下一个更新时它将被覆盖。
- 获取上游以从其图像中删除卷。
- 从 Dockerfile 中删除 VOLUME 行,并根据上游 repo 构建新镜像。
具体来说,对于 Jenkins,他们已经实现了自己的解决方案,即/usr/share/jenkins/ref/
在首次启动时复制到 JENKINS_HOME 的目录。因此,您的镜像需要修改此文件夹,而不是直接修改文件夹。您将看到使用各种脚本(如和)/var/jenkins_home
完成此操作。install-plugins.sh
jenkins-support