jenkinsのdockerイメージからホストのdockerが使えるようにするDockerfile(docker in docker)

f:id:miya15:20180908164903p:plain

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

ビルドの例

$ 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をビルドして、既にコンテナがあったら削除して、新たにコンテナを作る例
下記をビルドの「シェルの実行」に入れる

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
  • 説明
    • 1行目:現在動いているdockerコンテナを表示(デバッグ目的で表示しているだけで実動作には無くても問題無い)
    • 2行目:ワークスペースにDockerfileがある前提でタグ「dockertest」を付けてビルド
    • 3行目:コンテナ名「webtestwork」が付いているコンテナが存在したら停止(停止したら削除されるrmオプションが付いている想定)
    • 4行目:コンテナ名「webtestwork」でイメージ名「dockertest」からコンテナを生成(停止したら削除されるrmオプション付き)