Docker image に OCI で定義されているラベルをつける

2020/10/02に公開

Dockerの大きな利点の一つとして、個々のコンテナ環境自体をリソースとみて URI が振られているため、どこからでも upload/download が可能という点があります。しかしこのままでは識別出きるだけで、それがどんなコンテナであるかはわかりませんね?

Dockerfile の仕様には LABEL というコマンドがあります

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

https://docs.docker.com/engine/reference/builder/#label

これによりイメージにメタ情報をつける事が出来ますが、これは名前空間 (com.example のようなやつ) と KEY=VALUE であることしか要請しないため、自分でラベルをつけて自分で使う分には使えますが、他のプロジェクトと連携しようとしたときに困ります。

そこで Open Container Initiaive (OCI) が定義している共用のラベルがあります
https://github.com/opencontainers/image-spec/blob/master/annotations.md#pre-defined-annotation-keys
たくさんあるので一部だけ取り上げますが、例えば rustmath/mkl-rust のコンテナに対しては

LABEL org.opencontainers.image.authors="Toshiki Teramura <toshiki.teramura@gmail.com>"
LABEL org.opencontainers.image.url="https://github.com/rust-math/intel-mkl-src"
LABEL org.opencontainers.image.documentation="Rust with Intel (R) MKL"
LABEL org.opencontainers.image.source="https://github.com/rust-math/intel-mkl-src/blob/master/docker/Dockerfile"
LABEL org.opencontainers.image.version="0.1.0"

のようにつける事が出来ます。これで OCI の仕様にしたがっている事を想定している別のプロジェクトと連携する事ができます。

Discussion