DooD(Docker outside of Docker)環境Jenkinsにおけるjenkins_homeと/var/run/docker.sockのパーミッション

備忘

# DooD(Docker outside of Docker)環境Jenkins

## 環境
- Fedora Linux 35 (Workstation Edition)
- Docker version 20.10.9, build c2ea9bc
- dockerデーモンは起動済み
- 操作ユーザーはdocker groupに属する (sudo usermod -aG docker $USER)
- jenkins_home は操作ユーザーの $HOME/jenkins_home とする


## 環境構築

#### Dockerfile

明瞭さを優先し、jenkins/jenkinsにget-docker.shを用いてdockerを導入



```Dockerfile:Dockerfile
FROM jenkins/jenkins
USER root
RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh && rm get-docker.sh
USER jenkins
```
#### docker build および docker run

```
$ mkdir $HOME/jenkins_home

$ docker build . -t jenkins-dood
...

$ docker images
REPOSITORY        TAG              IMAGE ID       CREATED        SIZE
jenkins-dood      latest           b07c3629294e   21 hours ago   944MB
jenkins/jenkins   2.322-jdk11      a7aa4a28243e   4 days ago     442MB
jenkins/jenkins   latest           a7aa4a28243e   4 days ago     442MB

$ docker run -d \
  --name jenkins-dood \
  -u $(id -u):$(id -g) \
  --group-add $(awk -F: '$1 == "docker" {print $3}' /etc/group) \
  -v $HOME/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -p 8080:8080 \
  -p 50000:50000 \
  jenkins-dood

$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                                                                      NAMES
6b38450bc7dd   jenkins-dood   "/sbin/tini -- /usr/…"   12 seconds ago   Up 11 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp   jenkins-dood

$ docker logs jenkins-dood  # 初期キーフレーズ確認などのため
...
```
podmanへの置き換えの可能性を考慮し、docker-composeの利用は一旦保留。

http://localhost:8080 にアクセスすることでJenkins管理画面に接続可能

#### コンテナ内からdockerコマンドが使用可能であることの確認

```
$ docker exec -it jenkins-dood /bin/bash
jenkins@6b38450bc7dd:/$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                                                      NAMES
6b38450bc7dd   jenkins-dood   "/sbin/tini -- /usr/…"   2 minutes ago   Up 2 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp   jenkins-dood
jenkins@6b38450bc7dd:/$ exit
exit
$ 
```

# 課題1: jenkins_homeのパーミッション
Jenkinsの設定などがおかれるjenkins_homeは、ローカルとシェアして永続化する。
docker run時、デフォルトではコンテナ内ではuidが1000のjenkinsユーザーとなる為、作成されるjenkins_home内のファイルもuid 1000となる。
これでは使い勝手が悪い為、docker run時に、\-u \$(id -u):\$(id -g)オプションを指定し、jenkins_home内のファイルの所有者、所有グループをコマンド実行ユーザーに合わせる。


# 課題2: /var/run/docker.sock へのアクセス許可

コンテナ内からもdockerを使えるようにする為、/var/run/docker.sockを共有させている。
外の/var/run/docker.sockは、所有グループのdockerグループに対する権限許可によりアクセスを可能としている。

```
$ ls -l /var/run/docker.sock 
srw-rw---- 1 root docker 0 Nov 27 10:18 /var/run/docker.sock
```

コンテナ内のプロセスも/var/run/docker.sockへのアクセスの為には、外のdockerグループのgidのグループに参加させる必要がある為、docker run時に、--group-add \$(awk -F: '\$1 == "docker" {print \$3}' /etc/group) オプションを指定する。

$()内の以下は、/etc/groupから、:区切りの第1項目がdockerの行の第3項目を出力する

```
awk -F: '$1 == "docker" {print $3}' /etc/group
```

# 参考資料

- [Install using the convenience script](https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script)

# その後の参照資料

- [Using Docker with Pipeline](https://www.jenkins.io/doc/book/pipeline/docker/)
- [Pipeline Syntax](https://www.jenkins.io/doc/book/pipeline/syntax/)
- [爆速でJenkinsをマスターしよう(Docker編) ~ JenkinsコンテナへのDockerインストール方法からJob DSL、Jenkins Pipelineまで ~](https://casualdevelopers.com/tech-tips/how-to-install-and-use-jenkins-on-docker-for-dockerized-application/)
- [Jenkinsジョブ（ビルド～テスト）をDockerコンテナ上で実行する ～Docker Pipeline Pluginを使ってみる～](https://www.kimullaa.com/entry/2017/06/13/003123)
- [Jenkinsを使った自動テスト環境を作る（後編）――Dockerコンテナを使って自動ビルドを実行する](https://knowledge.sakura.ad.jp/5433/)