I thought it might be interesting to show how to build a Docker container running Jenkins and tools like Terraform and Ansible. I am planning to use a Jenkins pipeline to deploy my OpenShift 3.11 example on AWS using Terraform and Ansible but more about this in the next post.
I am using the source Dockerfile from Jenkins and modified it, and added Ansible and Terraform: https://github.com/jenkinsci/docker. Below you see a few variables you might need to change depending on the version you are trying to use or where to place the volume mount. Have a look here for the latest Jenkins version: https://updates.jenkins-ci.org/download/war/.
Here is my Dockerfile:
... ARG JENKINS_HOME=/var/jenkins_home ... ENV TERRAFORM_VERSION=0.11.10 ... ARG JENKINS_VERSION=2.151 ENV JENKINS_VERSION $JENKINS_VERSION ... ARG JENKINS_SHA=a4335cc626c1f64da61a20174af654283d171b255a928bbacb6402a315e213d7 ...
Let’s start and clone my Jenkins Docker repository and run docker build:
git clone https://github.com/berndonline/jenkins-docker.git && cd ./jenkins-docker/ docker build -t berndonline/jenkins .
The docker build will take a few minutes, just wait and look out for error you might have with the build:
berndonline@lab:~/jenkins-docker$ docker build -t berndonline/jenkins . Sending build context to Docker daemon 141.3kB Step 1/51 : FROM openjdk:8-jdk 8-jdk: Pulling from library/openjdk 54f7e8ac135a: Pull complete d6341e30912f: Pull complete 087a57faf949: Pull complete 5d71636fb824: Pull complete 9da6b28682cf: Pull complete 203f1094a1e2: Pull complete ee38d9f85cf6: Pull complete 7f692fae02b6: Pull complete eaa976dc543c: Pull complete Digest: sha256:94bbc3357f995dd37986d8da0f079a9cd4b99969a3c729bad90f92782853dea7 Status: Downloaded newer image for openjdk:8-jdk ---> c14ba9d23b3a Step 2/51 : USER root ---> Running in c78f75ca3d5a Removing intermediate container c78f75ca3d5a ---> f2c6bb7538ea Step 3/51 : RUN apt-get update && apt-get install -y git curl && rm -rf /var/lib/apt/lists/* ---> Running in 4cc857e12f50 Ign:1 http://deb.debian.org/debian stretch InRelease Get:2 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB] Get:3 http://deb.debian.org/debian stretch-updates InRelease [91.0 kB] Get:4 http://deb.debian.org/debian stretch Release [118 kB] Get:5 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [459 kB] Get:6 http://deb.debian.org/debian stretch Release.gpg [2434 B] Get:7 http://deb.debian.org/debian stretch-updates/main amd64 Packages [5152 B] Get:8 http://deb.debian.org/debian stretch/main amd64 Packages [7089 kB] Fetched 7859 kB in 1s (5540 kB/s) Reading package lists... Reading package lists... Building dependency tree... ... Step 49/51 : ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/jenkins.sh"] ---> Running in 28da7c4bf90a Removing intermediate container 28da7c4bf90a ---> f380f1a6f06f Step 50/51 : COPY plugins.sh /usr/local/bin/plugins.sh ---> 82871f0df0dc Step 51/51 : COPY install-plugins.sh /usr/local/bin/install-plugins.sh ---> feea9853af70 Successfully built feea9853af70 Successfully tagged berndonline/jenkins:latest berndonline@lab:~/jenkins-docker$
The Docker container is successfully build:
berndonline@lab:~/jenkins-docker$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE berndonline/jenkins latest cd1742c317fa 6 days ago 1.28GB
Let’s start the Docker container:
docker run -d -v /var/jenkins_home:/var/jenkins_home -p 32771:8080 -p 32770:50000 berndonline/jenkins
Quick check that the container is successfully created:
berndonline@lab:~/jenkins-docker$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7073fa9c0cd4 berndonline/jenkins "/sbin/tini -- /usr/…" 5 days ago Up 7 seconds 0.0.0.0:32771->8080/tcp, 0.0.0.0:32770->50000/tcp jenkins
Afterwards you can connect to http://<your-ip-address>:32771/ and do the initial Jenkins configuration, like changing admin password and install needed plugins. I recommend putting an Nginx reverse proxy with SSL infront to secure Jenkins properly.
So what about updates or changing the configuration? – Pretty easy; because we are using a Docker bind mount to /var/jenkins_home/, all the Jenkins related data is stored on the local file system of your server and you can re-create or re-build the container at anytime.
I hope you like this article about how to create your down Jenkins Docker container. In my next post I will create a very simple Jenkins pipeline to deploy OpenShift 3.11 on AWS using Terraform.
Please share your feedback and leave a comment.