docker
dockerfile

Dockerfileが技術的負債になる前にラベルを付けよう

そのベースイメージはどのリポジトリで管理されてるの?

Dockerfileを分割管理したまでは良かったけれど、久々にベースのimageを更新しようとしたら、リポジトリどれだっけ?となり、時間を浪費したので解決策を共有します。

リポジトリのURLをLABELとして明示的に記載しよう

LABELはmaintainerだけ書くとこじゃないですよ。せっかくkey-value形式で何でも書けるので、後悔しないためにもここに運用上必要な情報を記載しておくことをオススメします。

公式のドキュメントによると、キーが被らないようにドメイン名をひっくり返した値をプレフィックスとして使うよう推奨されています。Javaのパッケージ名と同じですね。

例として、プロジェクト内でベースイメージとして使っているjava-baseと、アプリ用のイメージappのDockerfileがあるとします。ドメイン名がtakitake.techだとしたら、tech.takitakeがプレフィックスとなります。

ベースイメージ

Dockerfile.base
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"
}

アプリイメージ

Dockerfile.app
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等もラベルとして記載して辛くない運用ライフを送りましょう。