そのベースイメージはどのリポジトリで管理されてるの?
Dockerfileを分割管理したまでは良かったけれど、久々にベースのimageを更新しようとしたら、リポジトリどれだっけ?となり、時間を浪費したので解決策を共有します。
リポジトリのURLをLABELとして明示的に記載しよう
LABELはmaintainerだけ書くとこじゃないですよ。せっかくkey-value形式で何でも書けるので、後悔しないためにもここに運用上必要な情報を記載しておくことをオススメします。
公式のドキュメントによると、キーが被らないようにドメイン名をひっくり返した値をプレフィックスとして使うよう推奨されています。Javaのパッケージ名と同じですね。
例として、プロジェクト内でベースイメージとして使っているjava-base
と、アプリ用のイメージapp
のDockerfileがあるとします。ドメイン名がtakitake.tech
だとしたら、tech.takitake
がプレフィックスとなります。
ベースイメージ
FROM openjdk:9-jre
LABEL tech.takitake.base.image.source=http://takitake.tech/base-image.git
$ docker build -t takitake/java-base -f Dockerfile.base .
すると、ベースイメージのラベルは以下のようになります。
$ docker inspect takitake/java-base:latest | jq '.[0].Config.Labels'
{
"tech.takitake.base.image.source": "http://takitake.tech/base-image.git"
}
アプリイメージ
FROM takitake/java-base
LABEL tech.takitake.app.image.source=http://takitake.tech/app-image.git
$ docker build -t takitake/app -f Dockerfile.app .
そして、最終的なラベルは以下のようになります。
$ docker inspect takitake/app:latest | jq '.[0].Config.Labels'
{
"tech.takitake.app.image.source": "http://takitake.tech/app-image.git",
"tech.takitake.base.image.source": "http://takitake.tech/base-image.git"
}
これで、アプリイメージのラベルを確認するだけで、ベースとアプリそれぞれのリポジトリが簡単に確認することができるようになりました。この調子で、ビルドジョブのURL等もラベルとして記載して辛くない運用ライフを送りましょう。