Joey Yi Zhao
Joey Yi Zhao

Reputation: 42576

Why can't docker commit a Jenkins container with customized configuration?

I pulled a Jenkins image and launched it. Then I did some configuration on that container. Now I want to save all my configuration into a new image. Below is the command I used:

$ 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

From above output, you can see that the jenkins container f214096e4847 is running.

Now I use below command to commit my changes and create a new image:

$ docker commit f214096e4847 my_ci/1.0
sha256:d83801a700c4060326a5209b87281bfb0e93f46207d960038ba2d87628ddb90c

Then I stop the current container and run a new container from my_ci/1.0 image:

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

But the new container doesn't include any changes I made. It looks like a container got created from original jenkins image. How to persist my data when using docker commit?

EDIT1

I know that I can add a volume to save the configuration data as below:

-v my_path:/var/jenkins_home

But I really want to save it on the docker image. So users don't need to provide the configuration from their host.

Upvotes: 1

Views: 2552

Answers (1)

lvthillo
lvthillo

Reputation: 30791

It's important to know that this isn't a good approach. As told you in the comments. The recommended way is to mount volumes.

But if you really want your volume in the image I can propose another way. You can create your own image derived from the official image:

Clone the git repo of the original image

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

This contains the following:

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

You just need to make one edit in the Dockerfile. Replace the VOLUME by a mkdir command

# 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

Rebuild your own image:

docker build -t my-jenkins:1.0

Start your own jenkins + install some plugins + create some jobs.

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

When you're ready with creating the desired jobs you can commit the container as an image.

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

This newest jenkins container will contain your plugins + jobs by default.

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

This will work in your case. But as I said. It's not recommended. It makes your content dependent of the image. So it's more difficult when you want to perform updates. Also your image can be too big (size).

Upvotes: 3

Related Questions