jenkinsのdockerイメージからホストのdockerが使えるようにするDockerfile(docker in docker)
jenkinsはdockerイメージが公式に公開されているので使いやすいですが、jenkins自体がコンテナとして動くのでホスト側のdockerコマンドを実行させるには多少の小細工が必要です。これはdocker in dockerと呼ばれているらしく、このキーワードで検索すれば比較的目的の記事が見つかりやすいと思います。
今回はjenkinsのイメージを使っていますがdocker in docker自体は他のイメージでも概念は一緒です。
Dockerfileの例
公式のjenkinsイメージを使ってdockerとdocker-composeをインストールします。
- ポイント
- ユーザー切り替えを行ってインストールを進めている点(最後にjenkinsに戻しています)
- jenkinsユーザーにdockerコマンドのsudo権を与えている点
FROM jenkins:latest USER root RUN apt-get update -y RUN apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg2 \ software-properties-common RUN curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | apt-key add - RUN add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \ $(lsb_release -cs) \ stable" RUN apt-get update RUN apt-get install -y docker-ce RUN curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose RUN chmod +x /usr/local/bin/docker-compose RUN echo "jenkins ALL=(root) NOPASSWD: /usr/bin/docker" >> /etc/sudoers USER jenkins
ビルドの例
- カレントディレクトリに上記のDockerfileがある前提
$ sudo docker build -t jenkinsdid .
実行時の例
- ホスト側のdocker.sockをコンテナ側にバインドしている点がポイント
$ sudo docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock jenkinsdid
jenkinsでdockerイメージをビルドする例
jenkinsでDockerfileをビルドして、既にコンテナがあったら削除して、新たにコンテナを作る例
下記をビルドの「シェルの実行」に入れる
- ワークスペースのルートにビルドしたいDockerfileが存在する前提
sudo docker ps -a sudo docker build -t dockertest $WORKSPACE if sudo docker ps -a | grep webtestwork -n; then sudo docker stop webtestwork; fi sudo docker run -d --rm --name webtestwork dockertest /sbin/init