OSS版drone.io を使って Docker Image をビルドしてみる
だいぶ月日が空いてしまいましたが、今日はオープンソースの
コンテナー管理ソフトウェアDockerを使った記事となります。
ゴールとしては、レポジトリの Dockerfile を更新したら自動で
Docker Imageをテスト/ビルドして Registry に Push するまでの
環境を構築するまでとなります。
Docker コンテナ内で Docke Image をビルドするため、Docker in
Docker な環境が必要なので注意してください。
Drone, Docker Registry のインストールは終わっている前提となります。
■レポジトリの構成
/my-repository:branch
|–.drone.yml
|
|–/.drone
| |–build.sh
|
|–Dockerfile
※branch で 各 Dockerfile を管理します。
■.drone.yml の中身
—————————————————————–
image: docker-registry:5000/dind
env:
– DOCKER_DAEMON_ARGS=–insecure-registry docker-registry:5000
script:
– ./.drone/build.sh
notify:
slack:
webhook_url: ‘https://hooks.slack.com/services/…
channel: ‘#my-channel’
username: ‘drone.io’
※image は alpine をベースに dind(wrapdocker) をインストールしたコンテナを使用
※registry に push する際にエラーとなるため、DOCKER_DAEMON_ARGS に insecure-registry オプションを指定
(本当はちゃんと証明書を用意した方が良い)
※通知は Slack にメッセージを流す
—————————————————————–
■Dockerfileの中身
dind コンテナを作成した際の Dockerfile は以下のような感じ
—————————————————————–
FROM alpine:3.2
RUN apk add –update \
curl \
bash \
openssh \
perl \
git \
btrfs-progs \
e2fsprogs \
iptables \
xz \
&& rm -rf /var/cache/apk/*
ENV DOCKER_BUCKET get.docker.com
ENV DOCKER_VERSION 1.8.2
ENV DOCKER_SHA256 97a3f5924b0b831a310efa8bf0a4c91956cd6387c4a8667d27e2b2dd3da67e4d
RUN curl -fSL “https://${DOCKER_BUCKET}/builds/Linux/x86_64/docker-$DOCKER_VERSION” -o /usr/local/bin/docker \
&& echo “${DOCKER_SHA256} /usr/local/bin/docker” | sha256sum -c – \
&& chmod +x /usr/local/bin/docker
ENV DIND_COMMIT b8bed8832b77a478360ae946a69dab5e922b194e
RUN wget “https://raw.githubusercontent.com/docker/docker/${DIND_COMMIT}/hack/dind” -O /usr/local/bin/dind \
&& chmod +x /usr/local/bin/dind
ADD ./binary/dmsetup /usr/local/bin/dmsetup
RUN chmod +x /usr/local/bin/dmsetup
VOLUME /var/lib/docker
CMD [“wrapdocker”]
—————————————————————–
■build.shの中身
#!/bin/bash
set -e
cd /var/cache/drone/src/path/to/dockerfile
/usr/local/bin/wrapdocker &
sleep 60
docker build -t docker-registry:5000/$DRONE_BRANCH .
docker push docker-registry:5000/$DRONE_BRANCH
※image は branch 名をつける
※環境によっては wrapdocker の起動に時間がかかる場合もあったため sleep は長めに設定
■Drone側の設定
dind は privileged オプションが必要なため、事前に drone 側のレポジトリ設定を privileged を有効にしておく
“private”: true,
“privileged”: true,
“post_commits”: true,
Dockerfile を適当に修正して push すると自動的にテストが実行
下記の画像のようになればOKです。
レポジトリの Dockerfile を更新したら自動で Registry に Push されるため、
Registry 上の Docker Image は常に最新の状態になります。
いかがでしたでしょうか?
最近はやりのCI化の入門に、お試し頂ければと思います。