docker-composeを使って開発環境でJenkinsを動かせるようにした時のトラシュー

↓を参考にハンズオンしてみた時につまずいたポイントをまとめました。

[docker-composeを使って開発環境でjenkinsを動かせるようにする](https://qiita.com/i_whammy_/items/84b71c56d70817803472)
# /var/jenkins_homeのパーミッションエラー

```docker-compose.yml
version: "3"
services:
  master:
    container_name: master
    image: jenkins:latest
    ports:
      - 18080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
```

docker-compose.ymlを上のように書き`docker-compose up`したところ、

```
master | touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
master | Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
```

というエラーメッセージが。↓の記事を参考にボリュームを`/var/lib/jenkins_home`にしたところパーミッションエラーは起きなくなりました。
[docker-compose permission denied: へっぽこSEのメモメモ](http://heppoen.seesaa.net/article/463347635.html)

# Jenkinsのプラグインインストールが失敗する
無事`docker-compose up`が成功してJenkinsが立ち上がったのでブラウザからアクセスしてセットアップを完了しようと思ったのですが、

![スクリーンショット (37).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507842/fa1b8b2f-6593-da6b-4614-4f96ce14321b.png)

この有様。

調べたところ、Matserに使用したイメージが良くなかった模様。

>Jenkinsのイメージには、2つ、有名なのがあり、混同しがちです。jenkinsとjenkins/jenkinsは異なるイメージです。
前者はdocker公式イメージで、後者はjenkinsチームがメンテしています。
公式の方がよいと思うかもしれませんが、開発には、後者が扱いやすいと思います。

[proxy背後でJenkinsのプラグインをインストールする時のエラーの対処(docker&windows)](https://web.plus-idea.net/2019/07/proxy-jenkins-plugin-install-docker/)

`image: jenkins/jenkins:latest`と書き換えて再度プラグインをインストールすると上手くいきました。
# Matserがslave01を認識できない

Masterの準備は完了したので、いよいよslaveを立てて疎通させようと思ったのですが、[新規ノード作成]をしても↓のslave02のような状態に...（画像は成功したあとのものです）
![スクリーンショット (42).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507842/5fa8c1cf-3689-d2a3-5021-cbe85ccd155f.png)
ログを見るとSSHログイン自体はできているようなのですが、

```
[SSH] Checking java version of /usr/local/java/bin/java
Couldn't figure out the Java version of /usr/local/java/bin/java
bash: /usr/local/java/bin/java: No such file or directory
```

というように、Javaのバージョンが取得できないエラーが発生しているようです。

試しにslave01コンテナに入って確認してみると、

```
$ sudo docker exec -it slave01 which java
/usr/local/openjdk-8/bin/java
$ sudo docker exec -it slave01 java -version
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)
```

あれ、取得できる・・・？

しばらく悩んだ後、[新規ノード作成]の[認証情報]で入力したユーザ名が`jenkins`だったことを思い出し、今度は`jenkins`ユーザでslave01に入ると、

```
$ sudo docker exec -it slave01 su - jenkins
jenkins@9a5854980721:~$ java -version
-su: java: command not found
jenkins@9a5854980721:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
```

Javaコマンドが入っている`/usr/local/openjdk-8/bin`が`jenkins`ユーザの環境変数`PATH`に入っていないことが判明しました。

調べたところ、`jenkins`ユーザの`PATH`を変えるよりもパスが通っているディレクトリに`/usr/local/openjdk-8/bin/java`のシンボリックリンクを置く方がいいらしいことがわかった[^1]ので、`docker-compose.yml`と同じディレクトリに↓の`Dockerfile`を置き、`docker-compose.yml`も書き換えました。（Dockerfile書かずにできるやり方があったら教えてほしいです）

```Dockerfile
FROM jenkinsci/ssh-slave
RUN ln -s /usr/local/openjdk-8/bin/java /usr/local/bin/java
```

```docker-compose.yml
version: "3"
services:
  master:
    container_name: master
    image: jenkins/jenkins:latest
    ports:
      - 18080:8080
    volumes:
      - ./jenkins_home:/var/lib/jenkins_home
    links:
      - slave01

  slave01:
    container_name: slave01
    build: .
    environment:
      - JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa AAAA...
```

これで`docker-compose up -d`を実行すると、

```bash
$ docker-compose up -d
Recreating slave01 ... done
Recreating master  ... done
$ docker-compose ps
 Name                Command               State                 Ports               
-------------------------------------------------------------------------------------
master    /sbin/tini -- /usr/local/b ...   Up      50000/tcp, 0.0.0.0:18080->8080/tcp
slave01   setup-sshd                       Up      22/tcp 
```

ちゃんと立ち上がっていますね。その後上手く疎通させられたことは、上に貼ったスクショのとおりです。

# 感想
なんやかんやありましたが、やっぱりDocker Composeは便利だなぁと思いました。

[^1]: https://issues.jenkins-ci.org/browse/JENKINS-18767?focusedCommentId=313660&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-313660