はじめに
JenkinsをDokerコンテナで動かすのではなく、JenkinsのパイプラインをDocker outside of Dockerで実行します。
- DooD(Docker outside of Docker)とは
- コンテナからコンテナを操作したいときに使用します
- コンテナ内から、ホストのDocker環境で実行されます。
- DinD (Docker in Docker)は、コンテナ内でDockerデーモンを起動します。
環境
- Jenkins : 2.332.2
- Docker : 20.10.13
- DockerPipelineプラグイン : 1.28
シェルでコンテナを起動
Dockerイメージは、Dockerがインストールされているイメージを選びます。
ホストのdocker.sockをマウントし、コンテナを起動します。
ホストで表示したDockerイメージが、コンテナ内からでも確認できます。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker git cd38c7dd585a 2 days ago 307MB $ docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock docker:git /bin/ash / # docker images //ホストと同様のイメージが表示されます REPOSITORY TAG IMAGE ID CREATED SIZE docker git cd38c7dd585a 2 days ago 307MB / # exit $
JenkinsパイプラインをDooDで実行
JenkinsパイプラインをDooDで実行し、Dockerイメージを作成します。
- Jenkinsパイプライン
- agent dockerの引数argsに、"-v /var/run/docker.sock:/var/run/docker.sock -u root"を指定します。
- ”-u root”を付けないと、権限がなく失敗します。
pipeline { agent { docker { image "docker:git" args "-v /var/run/docker.sock:/var/run/docker.sock -u root" } } stages { stage('git_clone') { steps { sh "git clone https://github.com/dockersamples/node-bulletin-board.git" } } stage('docker_build') { steps { sh "docker build --tag bulletinboard:1.0 ./node-bulletin-board/bulletin-board-app" } } stage('delete_ws') { steps { cleanWs() } } } }
- 実行ログ
Started by user user [Pipeline] Start of Pipeline [Pipeline] node Running on node in /home/ec2-user/workspace/job_DooD [Pipeline] { [Pipeline] isUnix [Pipeline] withEnv [Pipeline] { [Pipeline] sh + docker inspect -f . docker:git . [Pipeline] } [Pipeline] // withEnv [Pipeline] withDockerContainer node does not seem to be running inside a container $ docker run -t -d -u 1000:1000 -v /var/run/docker.sock:/var/run/docker.sock -u root -w /home/ec2-user/workspace/job_DooD -v /home/ec2-user/workspace/job_DooD:/home/ec2-user/workspace/job_DooD:rw,z -v /home/ec2-user/workspace/job_DooD@tmp:/home/ec2-user/workspace/job_DooD@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** docker:git cat $ docker top 199eef053ea1abf7afed79c2504b84d761e89a4e28e2089199bf6f899db33340 -eo pid,comm [Pipeline] { [Pipeline] stage [Pipeline] { (git_clone) [Pipeline] sh + git clone https://github.com/dockersamples/node-bulletin-board.git Cloning into 'node-bulletin-board'... [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (docker_build) [Pipeline] sh + docker build --tag bulletinboard:1.0 ./node-bulletin-board/bulletin-board-app Sending build context to Docker daemon 45.57kB Step 1/7 : FROM node:current-slim current-slim: Pulling from library/node 42c077c10790: Pulling fs layer (略) Step 7/7 : COPY . . ---> 13886f72f686 Successfully built 13886f72f686 Successfully tagged bulletinboard:1.0 [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (delete_ws) [Pipeline] cleanWs [WS-CLEANUP] Deleting project workspace... [WS-CLEANUP] Deferred wipeout is used... [WS-CLEANUP] done [Pipeline] } [Pipeline] // stage [Pipeline] } $ docker stop --time=1 199eef053ea1abf7afed79c2504b84d761e89a4e28e2089199bf6f899db33340 $ docker rm -f 199eef053ea1abf7afed79c2504b84d761e89a4e28e2089199bf6f899db33340 [Pipeline] // withDockerContainer [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline Finished: SUCCESS
ホストからDockerイメージを確認すると、ビルド元やビルドしたイメージがあります。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE bulletinboard 1.0 13886f72f686 19 seconds ago 265MB docker git cd38c7dd585a 2 days ago 307MB node current-slim 2d19bed8d228 6 days ago 245MB
参考
- コンテナからコンテナを操作する
- DinDも含めとても助かりました。