Docker イメージの LABEL 情報は Label-Schema が標準になる

f:id:kyagi:20180216163134p:plain

Docker イメージのメタ情報(メンテナ、ライセンス種別、ビルド日時、Github の URL など) は LABEL に集約しようという動きが広まってきている。そのために「どういった情報を載せるべきか」という議論がコミュニティベースで展開された結果、標準として Label-Schema という規格で定まってきているようだ。

label-schema.org

Docker 社もこの動きには賛同している。現在は 1.0.0-rc.1 (Release Candidate) だが、近いうちに正式に標準となりそうだ。

Docker Inc. express a preference that container labels should be namespaced. Label Schema is a community project to provide a shared namespace for use by multiple tools, specifically org.label-schema.

個人的にもイメージの透明性を高めるために当然の動きだと思う。正直 Dockerhub でよさそうなイメージを見つけても Dockerfile が公開されていない(≒ Github 連携していない) イメージは怖くて使えない。

Dockerfile の中で ARG で指定した変数は docker build 時に --build-arg var=value とオプションで渡すことができる。動的な情報のビルド日時や VCS_REF(=git のコミット値(SHA)) が対象となるようだ。

$ docker build --build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` .
(... snip ...)
Successfully built d187459cd07e

$ docker image inspect d187459cd07e | jq '.[].ContainerConfig.Labels' | jq '.["org.label-schema.build-date"]'
"2018-02-05T16:39:17Z"

$ date
Tue Feb  6 01:57:38 JST 2018

Github と Dockerhub を連携して Automated Build を設定している場合は hooks/build というスクリプトを置くことで同様に ARG で指定した変数を渡すことができる。サンプルを公開してくださっている方がいるので、こちらを参考に GitHub - kyagi/rod: REPLs On Docker を修正した。

github.com

Automated Build されたイメージを pull して LABEL 情報を確認すると vcs-ref がきちんと入っていることを確認できた。

$ docker image inspect kyagi/rod:latest | jq '.[].ContainerConfig.Labels' | jq -r '.["org.label-schema.vcs-ref"]'
02714fd

git rev-parse --short HEAD
commit 02714fd

ただ、問題がふたつ。ひとつめは、LABEL に BUILD_DATE など動的な値を渡すとキャッシュが効かなくなるようで、ビルドに時間がかかる。--no-cache を指定した時と同じ動きをしているように見える。ふたつめは org.label-schema.abc とキー名にドットが入っているせいで jq の処理に手間がかかる。どうしたものかなあ。(´・_・`)