基于运行中容器创建的Docker新镜像未保留更新内容问题
问题原因
官方Jenkins Docker镜像已经将/var/jenkins_home目录声明为VOLUME(Docker用于持久化数据的特殊目录),而docker commit有个核心限制:它不会包含VOLUME目录下的任何数据。你在Jenkins里创建的用户、更新的插件等所有配置,其实都存储在/var/jenkins_home里,所以通过docker commit生成的新镜像完全没有这些内容,启动后自然回到初始状态。
解决方案
1. 放弃docker commit,用Dockerfile构建可复用镜像(最佳实践)
Docker的核心思想是用代码定义镜像,通过修改Dockerfile固化你的Jenkins配置:
- 如果你需要预安装插件,把所有需要的插件(包括后来手动更新的)更新到
plugins.txt文件,重新执行docker build构建镜像即可。 - 如果你需要预配置用户或全局设置,可以把配置文件复制到
/usr/share/jenkins/ref/目录(Jenkins启动时会自动将这个目录的内容同步到/var/jenkins_home,仅当目标目录为空时生效)。示例Dockerfile片段:# 在USER jenkins之后添加 COPY config.xml /usr/share/jenkins/ref/config.xml COPY users/ /usr/share/jenkins/ref/users/
2. 用数据卷持久化Jenkins数据(推荐用于运行时动态配置)
如果需要保留容器运行后的动态修改(比如手动更新的插件、新建的用户),应该在启动容器时挂载Docker数据卷,而非依赖docker commit:
- 第一次启动容器时挂载卷:
docker run --net=host --name=my_jenkins -d -v jenkins_data:/var/jenkins_home -p 8080:8080 -p 50000:50000 myjenkins - 后续启动新容器时,只要挂载同一个
jenkins_data卷,就能直接复用之前的所有配置:docker run --net=host --name=alm_jenkins -d -v jenkins_data:/var/jenkins_home -p 8080:8080 -p 50000:50000 myjenkins
3. 强制将VOLUME数据打包进新镜像(应急方案,不推荐)
如果一定要基于现有容器创建包含配置的镜像,可以先把VOLUME数据复制出来,再通过Dockerfile打包:
- 从运行的容器中复制
/var/jenkins_home到本地:docker cp c052fd7a26b3:/var/jenkins_home ./jenkins_local_data - 创建新的Dockerfile,复制数据并修正权限:
FROM jenkins/jenkins:lts USER root ENV http_proxy http://bc-proxy-vip.de.pri.o2.com:8080 ENV https_proxy http://bc-proxy-vip.de.pri.o2.com:8080 RUN apt-get update && apt-get install -y ldap-utils curl wget vim nano sudo RUN adduser jenkins sudo # 复制本地Jenkins数据到镜像 COPY jenkins_local_data /var/jenkins_home # 修正目录权限,确保jenkins用户能访问 RUN chown -R jenkins:jenkins /var/jenkins_home USER jenkins EXPOSE 8080 EXPOSE 50000 - 构建新镜像:
docker build --no-cache -t almjenkins:version1 .
内容的提问来源于stack exchange,提问作者user2439278
相关产品推荐
相关产品推荐

