読者です 読者をやめる 読者になる 読者になる

DockerイメージとGitのブランチ戦略

Git Docker

今のプロジェクトではDockerを本格投入し始めましたが、ブランチの運用もちゃんと考えないといけないなーと思って考えた次第。

リポジトリ

モノリシックに色々な責務を持つリポジトリではなくて、1リポジトリ=1Dockerfileにするのが良いと思う。CIも無駄なく運用できる。

配備

1つのDockerサーバには複数のコンテナが配備されます。例えばWeb用コンテナだったりAPIコンテナだったり。今まで、よくホワイトボードとかにdev環境の利用状況やブランチとかを表に書いてたりしましたが、これは今まで通りで次の表みたいなイメージで良いかと。

dev1 dev2 dev3
Webコンテナ master feature/xxx hotfix/xxx
APIコンテナ master feature/yyy hotfix/xxx

Dockerイメージ

あのブランチからできたDockerイメージをディプロイしたい、っていうことが当然あります。ということは、イメージはGitのブランチ名で識別できなければならないわけです。

Dockerイメージにはタグでバージョンをつけることができます。最新のものはlatestとつけられますが、任意のバージョン名でタグ付けしてしまうと同名ではforce pushしないと更新できません。それは微妙なので、今のところ次のような運用を考えてます。

masterブランチ

本流であるmasterブランチはストレートにlatestでよいでしょう。

master -> USER_NAME/image-name:latest

リリースバージョン、またはタグ付けされたリビジョン

実際にリリースされたバージョンの場合、Gitで作成したタグをイメージでも採用すればよいでしょう。

master -> USER_NAME/image-name:X.X.X

開発中のfeatureブランチ

バージョンにブランチ名を入れる

ブランチ名をバージョンに利用する方式。スラッシュは使えないので、アンダースコアに置換して使うとか。ただ、バージョンを利用する方法だとforce pushは避けられません。

feature/xxx -> USER_NAME/image-name:feature_xxx
イメージ名にブランチ名を入れる

ブランチ名をイメージに利用する方式。これであればlatestが使えます。これもスラッシュを置換する必要はあり。

feature/xxx -> USER_NAME/image-name_feature_xxx:latest

ただ、USER_NAMEでブラウジングすると本流とは関係ないイメージで汚染されそう・・・

USER_NAMEにブランチ名を入れる

独自でPrivate Docker Registryを利用している場合、USER_NAME部分も気軽に変えられます。

feature/xxx -> USER_NAME_feature_xxx/image-name:latest

これであれば、USER_NAME/image-nameが正式なリリース成果物でないもので汚染されなくて済みそう。削除する場合も、ブランチに紐付いたイメージを1発で消せるので良さそうな気がする。

とりあえずこんな感じでちょっと回してみるって感じですな。