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


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

docker-composeを使って開発環境でjenkinsを動かせるようにする

/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のメモメモ

Jenkinsのプラグインインストールが失敗する

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

この有様。

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

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

proxy背後でJenkinsのプラグインをインストールする時のエラーの対処(docker&windows)

image: jenkins/jenkins:latestと書き換えて再度プラグインをインストールすると上手くいきました。

Matserがslave01を認識できない

Masterの準備は完了したので、いよいよslaveを立てて疎通させようと思ったのですが、[新規ノード作成]をしても↓のslave02のような状態に...(画像は成功したあとのものです)

ログを見ると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/binjenkinsユーザの環境変数PATHに入っていないことが判明しました。

調べたところ、jenkinsユーザのPATHを変えるよりもパスが通っているディレクトリに/usr/local/openjdk-8/bin/javaのシンボリックリンクを置く方がいいらしいことがわかった1ので、docker-compose.ymlと同じディレクトリに↓のDockerfileを置き、docker-compose.ymlも書き換えました。(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を実行すると、

$ 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は便利だなぁと思いました。