我拉了一张詹金斯图像然后启动它。然后我在那个容器上做了一些配置。现在我想将所有配置保存到新图像中。以下是我使用的命令:
$ 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正在运行。
现在我使用下面的命令提交我的更改并创建一个新图像:
$ docker commit f214096e4847 my_ci/1.0
sha256:d83801a700c4060326a5209b87281bfb0e93f46207d960038ba2d87628ddb90c
然后我停止当前容器并从my_ci / 1.0 image运行一个新容器:
$ docker stop f214096e4847 f214096e4847 $ docker run -d --name myci -p 8081:8080 my_ci / 1.0 aba1660be200291d499bf00d851a854c724193c0ee2afb3fd318c36320b7637e
但新容器并未包含我所做的任何更改。它看起来像是从原始jenkins图像创建的容器。如何在使用docker commit时保留我的数据?
EDIT1
我知道我可以添加一个卷来保存配置数据,如下所示:
-v my_path:/var/jenkins_home
但我真的想将它保存在docker图像上。因此,用户无需从其主机提供配置。
答案 0 :(得分:2)
了解这不是一个好方法,这一点非常重要。正如评论中告诉你的那样。推荐的方法是安装卷。
但如果你真的想要你的图像中的音量我可以提出另一种方式。您可以创建自己的官方图像衍生图像:
克隆原始图像的git repo
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
进行一次编辑即可。用VOLUME
命令替换mkdir
# 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
重建自己的形象:
docker build -t my-jenkins:1.0
启动你自己的jenkins +安装一些插件+创建一些工作。
docker run -d -p 8080:8080 -p 50000:50000 my-jenkins:1.0
当您准备好创建所需的作业时,您可以将容器作为图像提交。
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
这适用于您的情况。但正如我所说。不建议这样做。它使您的内容依赖于图像。因此,当您想要执行更新时,这会更加困难。您的图像也可能太大(尺寸)。