やりたいこと
- ローカルをクリーンに保ちたいのでコンテナ内でjenkinsを走らせたい
- jenkinsのジョブとして、コンテナを生成してその中でビルドを走らせたい
要はDocker outside of Docker要件です。
丸一日ウンウン唸ってやっと解決できたっぽいので仮投稿。
まとめ
-
docker.sock
をコンテナにマウントすると、ホストと同格のdockerコマンドが叩けるようになる -
docker-compose
がdocker-compose.ymlを探すときはコンテナ内を見ているが、docker.sock
はホストを見ているので、(混乱ポイント1) - コンテナ内でdocker-compose.ymlのボリュームを相対パス(
./***
のような書き方)で指定すると無を参照する(仕様っぽい) - マウント対象のディレクトリが存在しないとき、
docker-compose
はエラーを吐かずに空のディレクトリを生成する(混乱ポイント2) - ホスト側の絶対パスで指定すれば、コンテナ内でもきちんとマウントすることができる
-
$PWD
とか$JOB_NAME
(jenkinsの環境変数)を使って、うまいこと動的に絶対パスを生成する - HAPPY.....
解法
jenkinsコンテナとビルド用コンテナはそれぞれ別のrepoでVCSで管理されている想定です
▼jenkinsコンテナ
version: '3'
services:
jenkins:
container_name: 'jenkins'
build:
context: ./container
dockerfile: Dockerfile # jenkins/jenkins:ltsのイメージを使用しています
ports:
- '8080:8080'
- '5000:5000'
volumes:
- ./jenkins:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
environment:
- HOST_PWD=$PWD
▼ビルド用コンテナ
jenkinsジョブのworkspaceから実行したいほう
docker-compose.yml
version: '3'
services:
work:
build:
context: ./server
dockerfile: container/Dockerfile
container_name: 'work'
tty: true
volumes:
- /dev/shm:/dev/shm
# - ./server/:/server/ ↓に書き換え
- $HOST_PWD/jenkins/jobs/$JOB_NAME/workspace/server/:/server/
▼ビルド用コンテナ
ローカルで直接実行するほう
docker-compose-local.yml
実行するときは docker-compose -f docker-compose-local.yml up -d
でymlファイルを指定すればよい
version: '3'
services:
work:
build:
context: ./server
dockerfile: container/Dockerfile
container_name: 'work'
tty: true
volumes:
- /dev/shm:/dev/shm
- ./server/:/server/ # 相対パスのままでよい