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