概要
Docker Hubにある公式のjenkinsを手元で動かします。
永続化のために、ローカルディレクトリをvolumeに指定しても、うごかないかとおもったので、その時のことをまとめます。
結論を先に書いておくと、Jenkinsのホームにつかうディレクトリに書き込み権限がなかったため動かいていなかったようです。
Docker コンテナ内のJenkinsのidと、コンテナ内のidがあっていなかったことによります。
ディレクトリに書き込み権限を与えたら起動できました。
解決策1、コンテナ内のidにする
ディレクトリの権限を変えることができるならば、コンテナ内の、idに合わせる。
解決策2、-u でも解決できた。
特定のユーザーでもよければ、Jenkinsのホームに使うディレクトリと同じ、UID,GIDを-u でも起動することができるようだ。
Github jenkinsci/dockerのDockerfileを見ていたらUSERを追加している部分があり、気になったので、ユーザーidを指定できるか試した。起動時に以下のオプションを足した。
-u uid:gid
この方法でも起動でき、うまく動いているようである。
起動に使ったコマンド、その1
docker run --privileged --rm -v $PWD/jenkins_home:/var/jenkins_home -p 8080:8080 --name jenkins jenkins:1.584
起動したときのエラー
書き込み権限がないのかなと予想はついたのですが、
--privileged , (--privileged=true)をつけてもだめだったので、
何かなと思い、Dockerfileをみたところid の違いに気づき、ディレクトリに権限を与えたら、無事に起動できました。
$ docker run --privileged --rm -v $PWD/jenkins_home:/var/jenkins_home -p 8080:8080 --name jenkins jenkins:1.584
/usr/share/jenkins/ref/init.groovy.d/tcp-slave-angent-port.groovy
/usr/share/jenkins/ref/init.groovy.d/tcp-slave-angent-port.groovy -> init.groovy.d/tcp-slave-angent-port.groovy
copy init.groovy.d/tcp-slave-angent-port.groovy to JENKINS_HOME
mkdir: cannot create directory '/var/jenkins_home/init.groovy.d': Permission den
ied
cp: cannot create regular file '/var/jenkins_home/init.groovy.d/tcp-slave-angent
-port.groovy': No such file or directory
Running from: /usr/share/jenkins/jenkins.war
webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
Nov 13, 2015 7:10:33 AM winstone.Logger logInternal
INFO: Beginning extraction from war file
Nov 13, 2015 7:10:33 AM winstone.Logger logInternal
INFO: Winstone shutdown successfully
Nov 13, 2015 7:10:33 AM winstone.Logger logInternal
SEVERE: Container startup failed
java.io.FileNotFoundException: /var/jenkins_home/war/META-INF/MANIFEST.MF (No such file or directory)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
at java.io.FileOutputStream.<init>(FileOutputStream.java:171)
at winstone.HostConfiguration.getWebRoot(HostConfiguration.java:277)
at winstone.HostConfiguration.<init>(HostConfiguration.java:81)
at winstone.HostGroup.initHost(HostGroup.java:66)
at winstone.HostGroup.<init>(HostGroup.java:45)
at winstone.Launcher.<init>(Launcher.java:143)
at winstone.Launcher.main(Launcher.java:354)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at Main._main(Main.java:293)
at Main.main(Main.java:98)
その他、起動方法など
タイムゾーンを調整したかったので、以下の記事を参考にした。
また、jnlpで接続したかったので、50000 ポートも開放してみる。
docker run --rm -e JAVA_OPTS="-Djava.awt.headless=true -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Tokyo" -v $PWD/jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --name jenkins jenkins:1.584
最終的に、公開されているコンテナで最新のものを使うようにしたかったので、
docker run --rm -e JAVA_OPTS="-Djava.awt.headless=true -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Tokyo" -v $PWD/jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --name jenkins jenkins:1.625.2
これに-uでUID,GIDを指定した場合は、次のように起動できた
docker run -u 2015:2000 --rm -e JAVA_OPTS="-Djava.awt.headless=true -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Tokyo" -v $PWD/jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --name jenkins jenkins:1.625.2
追記2015-11-18
webで確認したときは、日本時間になっていたが、定期的実行しているジョブがどうもずれているかんじで、しらべてみたら、-Duser.timezone=Asia/Tokyo の設定も必要だった。
いまは次ような感じになっている。
docker run --rm -e JAVA_OPTS="-Duser.timezone=Asia/Tokyo -Djava.awt.headless=true -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Tokyo" -v $PWD/jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --name jenkins jenkins:1.625.2
追記2,2015-11-18
JenkinsとTimezoneについては以下のところも参考にした。
仮想マシンからDockerへの移行
もともと、仮想マシンで動かしていたのを、今回Docker化してみた。
単純に/var/lib/jenkinsのディレクトリをコピーしただけでうまく動いているようである。