
取りあえず公式イメージで Jenkins を立ち上げる
Jenkins を Docker コンテナで起動するのは、公式イメージがあるので簡単。
$ docker run -p 8080:8080 -it jenkins
とすればコンテナが起動して http://IPアドレス:8080 で Jenkins のダッシュボードにアクセスできる。
データの永続化
データが永続化されないと困るので JENKINS_HOME 以下をホスト OS 側にマウントしておく。Docker の公式イメージの JENKINS_HOME は /var/lib/jenkins ではなくて /var/jenkins_home なので注意。
$ docker run -p 8080:8080 -v $(pwd):/var/jenkins_home
コンテナのタイムゾーンをホスト OS のタイムゾーンに合わせる
ホスト OS のタイムゾーンが JST だった場合、コンテナのタイムゾーンも JST になります。/etc/localtime をマウントするだけ。
$ docker run -p 8080:8080 -v /etc/localtime:/etc/localtime:ro -it jenkins
Jenkins(Java) のタイムゾーンを変更する
Jenkins の時刻表示で使われるのはホスト OS のタイムゾーンではなくて Java のタイムゾーン。なので Jenkins ログなどの時刻のタイムゾーンを変更する場合は Java の起動オプションを設定する。 Jenkins 公式イメージの場合は、JAVA_OPTS に設定した値が Java の起動オプションとなるので、
$ docker run -p 8080:8080 -e JAVA_OPTS="-Duser.timezone=Asia/Tokyo" -it jenkins
とすればタイムゾーンは JST になる。
Jenkins のログとかの日本語対応
Jenkins のログが文字化けする場合がある。これも Java の起動オプションで明示的にエンコードを指定すれば文字化けないので一応、設定しておく。
$ docker run -p 8080:8080 -e JAVA_OPTS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8" -it jenkins
Jenkins コンテナから Docker コンテナを起動する
例えば Chef レシピの CI をする場合、Docker コンテナを起動して、それに対してレシピの適用 & Serverspec をしてコンテナ破棄、みたいなことをやってますが、その場合には Jenkins コンテナから Docker コンテナが起動できないといけないので、Jenkins コンテナから Docker コンテナを起動できるようにする必要があります。 ホスト OS の /var/run/docker.sock と docker バイナリをコンテナにマウントすることで Jenkins コンテナから Docker コンテナを起動することができるようになります。
$ docker run -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock:ro -v $(which docker):/bin/docker:ro -it jenkins
docker-compose を使いたい場合は、$(which docker-compose):/bin/docker-compose:ro もマウントしちゃってください。 ここまでの設定をしても「共有ライブラリが見つかりません」的なエラーが出る場合は、対象の共有ライブラリをマウントする必要があります。 私の場合、docker のファイルシステムを overlay にしているせいか、livdevmapper.so が見つからない、とエラーが出ました。なので、
-v /usr/lib64/libdevmapper.so.1.02:/usr/lib/x86_64-linux-gnu/libdevmapper.so.1.02:ro
を追加でマウント。
docker-compose にしてみる
これまでの設定を全て docker コマンドで実行しようとすると大変なので、コンテナは一個だけしかありませんが、docker-compose を使うと楽チン。
jenkins: image: jenkins:1.651.3 environment: - JAVA_OPTS="-Duser.timezone=Asia/Tokyo -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8" volumes: - $(pwd):/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock:ro - $(which docker):/bin/docker:ro - $(which docker-compose):/bin/docker-compose:ro - /usr/lib64/libdevmapper.so.1.02:/usr/lib/x86_64-linux-gnu/libdevmapper.so.1.02:ro - /etc/localtime:/etc/localtime:ro ports: - "8080:8080" - "50000:50000"
まとめ
今回は Jenkins コンテナを立ち上げる時の設定をあれこれ書いてみましたが、ほとんどの設定は他のコンテナでも同じことができます。 例えば、私は ホスト OS のタイムゾーンとコンテナのタイムゾーンを合わせたり、とかは全てのコンテナで設定してたりします。 ってことで、Docker で Jenkins が便利すぎるので、じゃんじゃん Docker Jenkins で CI しちゃってください。
でわでわ。