docker にある公式のjenkinsを手元で動かす。

# 概要

[Docker Hubにある公式のjenkins](https://hub.docker.com/_/jenkins/)を手元で動かします。
永続化のために、ローカルディレクトリをvolumeに指定しても、うごかないかとおもったので、その時のことをまとめます。

結論を先に書いておくと、Jenkinsのホームにつかうディレクトリに書き込み権限がなかったため動かいていなかったようです。
Docker コンテナ内のJenkinsのidと、コンテナ内のidがあっていなかったことによります。

ディレクトリに書き込み権限を与えたら起動できました。

## 解決策１、コンテナ内のidにする

ディレクトリの権限を変えることができるならば、コンテナ内の、idに合わせる。

## 解決策２、-u でも解決できた。

特定のユーザーでもよければ、Jenkinsのホームに使うディレクトリと同じ、UID,GIDを-u でも起動することができるようだ。


[Github jenkinsci/docker](https://github.com/jenkinsci/docker)のDockerfileを見ていたらUSERを追加している部分があり、気になったので、ユーザーidを指定できるか試した。起動時に以下のオプションを足した。

```
-u uid:gid
```
この方法でも起動でき、うまく動いているようである。

## 起動に使ったコマンド、その１

```
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)
```

### その他、起動方法など

タイムゾーンを調整したかったので、以下の記事を参考にした。

* [Amazon Linux/CentOSのJenkinsのタイムゾーンを指定する - Qiita](http://qiita.com/mechamogera/items/05ce25bc63e4d858d433)

また、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については以下のところも参考にした。
* [Change time zone - Jenkins - Jenkins Wiki](https://wiki.jenkins-ci.org/display/JENKINS/Change+time+zone)



### 仮想マシンからDockerへの移行

もともと、仮想マシンで動かしていたのを、今回Docker化してみた。
単純に/var/lib/jenkinsのディレクトリをコピーしただけでうまく動いているようである。