为什么docker不能通过定制configuration提交一个Jenkins容器?

我拉了一张jenkins的形象,并启动它。 然后我在那个容器上做了一些configuration。 现在我想将所有的configuration保存到一个新的图像。 以下是我使用的命令:

$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f214096e4847 jenkins "/bin/tini -- /usr/lo" About an hour ago Up 1 seconds 50000/tcp, 0.0.0.0:8081->8080/tcp ci 

从上面的输出中,可以看到jenkins容器f214096e4847正在运行。

现在我使用下面的命令来提交我的更改并创build一个新的图像:

 $ docker commit f214096e4847 my_ci/1.0 sha256:d83801a700c4060326a5209b87281bfb0e93f46207d960038ba2d87628ddb90c 

然后我停止当前的容器并从my_ci / 1.0映像运行一个新的容器:

$ docker stop f214096e4847 f214096e4847 $ docker run -d –name myci -p 8081:8080 my_ci / 1.0 aba1660be200291d499bf00d851a854c724193c0ee2afb3fd318c36320b7637e

但新的容器不包括我所做的任何更改。 它看起来像一个容器从原始jenkins图像创build。 如何在使用docker commit时保存我的数据?

EDIT1

我知道我可以添加一个卷来保存configuration数据如下:

 -v my_path:/var/jenkins_home 

但我真的想把它保存在docker上的图像。 所以用户不需要从主机提供configuration。

知道这不是一个好方法很重要。 正如在评论中告诉你的那样。 推荐的方法是安装卷。

但如果你真的想要在图像中的音量,我可以提出另一种方式。 您可以创build自己的图像派生自​​官方形象:

克隆原始图像的git回购

 git clone https://github.com/jenkinsci/docker.git 

这包含以下内容:

 CONTRIBUTING.md Jenkinsfile docker-compose.yml install-plugins.sh jenkins-volume plugins.sh update-official-library.sh Dockerfile README.md init.groovy jenkins-support jenkins.sh tests weekly.sh 

您只需要在Dockerfile进行一次编辑。 用mkdir命令replaceVOLUME

 # Jenkins home directory is a volume, so configuration and build history # can be persisted and survive image upgrades #VOLUME /var/jenkins_home RUN mkdir -p /var/jenkins_home 

重build自己的形象:

 docker build -t my-jenkins:1.0 

开始你自己的jenkins +安装一些插件+创build一些工作。

 docker run -d -p 8080:8080 -p 50000:50000 my-jenkins:1.0 

当您准备好创build所需的作业时,您可以将容器提交为图像。

 docker commit 30c5889032a8 my-jenkins-for-developers:1.0 

这个最新的jenkins容器默认包含你的插件+作业。

 docker run -d -p 8080:8080 -p 50000:50000 my-jenkins-for-developers:1.0 

这将在你的情况下工作。 但正如我所说。 这不是build议。 它使你的内容依赖于图像。 所以当你想要执行更新时更加困难。 而且你的图片可能太大(大小)。