delhi09の勉強日記

技術トピック専用のブログです。自分用のメモ書きの投稿が多いです。あくまで「勉強日記」なので記事の内容は鵜呑みにしないでください。

Docker HubとGitHubを連携してリポジトリからDockerイメージを自動ビルドする方法(2020/4/30時点)

Docker HubにはGitHubリポジトリからDockerfileを取得してイメージのビルド・タグ付けを自動で行ってくれる機能が存在する。
docs.docker.com

GitHubにDockerfileを上げているのであれば、この方が逐一ローカルでイメージをビルドしてpushするよりも断然楽なので、方法について書く。

GitHub側の準備

Docker Hubでイメージを公開したいDockerfileが存在するリポジトリを作成しておく。

今回は以下のリポジトリを使用する。
https://github.com/kamatimaru/docker-mysql57-ja

Docker Hub側の準備

Docker HubとGit Hubをアカウント連携する。

→ 特にハマるポイントはないので省略

リポジトリを作成する。

リポジトリ名は「mysql57-ja」とする。
※ ${ユーザー名}/${リポジトリ名}がDockerイメージの名称になるので注意。
(今回の例では「kamatimaru/mysql57-ja」)

f:id:kamatimaru:20200430173707p:plain

連携するGitHubリポジトリを指定する。

f:id:kamatimaru:20200430174014p:plain

「BUILD RULES」を設定する。

「BUILD RULES」というプルダウンを押すとビルドの条件を設定できる。
この設定で

  • ビルドがトリガーされるタイミング
  • イメージのタグ付けのルール

が決まる。

今回は以下の2つを設定する。

  1. GitHub側でmasterに変更がpushされた場合は、イメージのビルドを実行かつ「latest」とタグを打つ。
  2. GitHub側で数字のタグ(1.2など)がpushされた場合は、イメージのビルドを実行かつ同じ数字のタグを打つ(ex kamatimaru/mysql57-ja:1.2)。


・1に関しては、デフォルトで設定されているので、対応不要である。

f:id:kamatimaru:20200430175118p:plain


・2に関しては、「View example build rules」を押すと表示される設定例の「Match versions」から「release-」を削除したものをコピーして設定すればOK

f:id:kamatimaru:20200430180518p:plain

保存

「Create」を押す。
※ 「Create & Build」でもよいが、今回はpushしたときにビルドがトリガーされることを確認するので、「Create」のみとしている。

事前に必要な設定は以上

動作確認

masterに変更をpushした際の動作確認

・pushする。

$ git push origin master


・画面からビルドがトリガーされたことを確認できる。

f:id:kamatimaru:20200430181837p:plain


・完了

f:id:kamatimaru:20200430182245p:plain

数字のタグをpushした際の動作確認

・1.0とタグを打ってpushする。

$ git tag -a 1.0 -m 'version 1.0 released.'
$ git push origin 1.0

・画面からビルドがトリガーされたことを確認できる。

f:id:kamatimaru:20200430182819p:plain

・完了

f:id:kamatimaru:20200430183308p:plain

イメージをpullできるか確認

最後に、自動ビルドしたイメージをDocker Hubからpullできるか確認しておく。

$ docker pull kamatimaru/mysql57-ja
Using default tag: latest
latest: Pulling from kamatimaru/mysql57-ja
54fec2fa59d0: Already exists
bcc6c6145912: Already exists
951c3d959c9d: Already exists
05de4d0e206e: Already exists
319f0394ef42: Already exists
d9185034607b: Already exists
013a9c64dadc: Already exists
e745b3361626: Pull complete
03145d87b451: Pull complete
3991a6b182ee: Pull complete
62335de06f7d: Pull complete
2f66c962ba63: Pull complete
370a4e179afb: Pull complete
c9f8c02834ba: Pull complete
4bf79f5c9c7b: Pull complete
dc922bd9690b: Pull complete
6b4df9c045ed: Pull complete
b4b580d59a14: Pull complete
e6004b9c2dde: Pull complete
d4d4dd82f4a2: Pull complete
890c6a39b4f6: Pull complete
Digest: sha256:7fe88ae4d3c96c7a4f71f6af586a39bae05581c65ced99f9ecac73f8f295f5dc
Status: Downloaded newer image for kamatimaru/mysql57-ja:latest
docker.io/kamatimaru/mysql57-ja:latest
$ docker images | grep "/mysql57-ja"
kamatimaru/mysql57-ja                                 latest              e5aef8912018        17 minutes ago      485MB
$

→ 成功