概要

レポジトリの Dockerfile を更新したら自動で Docker Image をテスト/ビルドして Registry に Push するまでの環境を構築

※Docker コンテナ内で Docke Image をビルドするため、 Docker in Docker な環境が必要

参考
http://paislee.io/how-to-build-and-deploy-docker-images-with-drone/

環境

  • OS : CentOS Linux release 7.1
  • Docker : 1.8.2, build bb472f0/1.8.2
  • Docker Registry: 2.0
  • drone : 0.3.0-alpha

※Drone, Docker Registry等 のインストールは割愛

ビルドコンテナ

alpine ベースで DockerImage を作成

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"]

レポジトリの構成

/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 にメッセージを流す

ビルドスクリプト

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 は長めに設定

dind は privileged オプションが必要なため、事前に drone 側のレポジトリ設定を privileged を有効にしておく

  "private": true,
  "privileged": true,
  "post_commits": true,

実行

Dockerfile を適当に修正して push すると自動的にテストが実行

レポジトリの Dockerfile を更新したら自動で Registry に Push されるため、Registry 上の Docker Image は常に最新の状態になる