docker manifest
読む時間の目安: 4 分
説明
Docker イメージのマニフェストとその一覧を管理します。
このコマンドは Docker クライアントにおける試験的なものです。
本番環境では利用しないでください。
Docker CLI において試験的機能を有効にする場合は、config.json ファイルを編集して、
experimental
をenabled
に設定してください。 詳しくは こちら を参照してください。
利用方法
$ docker manifest COMMAND COMMAND
追加説明
docker manifest
コマンドだけでは、何も処理実行は行われません。
マニフェストやその一覧に対しての操作を行うには、サブコマンドを用いる必要があります。
1 つのマニフェストには、イメージに関するレイヤー、サイズ、ダイジェスト値などの情報を含みます。 docker manifest コマンドを使うと、これに加えてイメージがビルド対象とした OS やアーキテクチャーなどの情報も示されます。
マニフェストリストは、1 つまたは複数(できれば複数)のイメージ名の指定によって生成されたイメージレイヤーのリストのことです。
そこでこの情報は、たとえばdocker pull
コマンドやdocker run
コマンドのようなイメージ名を指定するコマンドにおいて、同様に利用することができます。
マニフェストリストは理想で言えば、さまざまな OS やアーキテクチャーを組み合わせても同等に機能するイメージを集めて生成します。 こういったことからマニフェストリストは「マルチアーキテクチャーのイメージ」(multi-arch images)と呼ばれることがあります。 2 つのイメージとして 1 つは Windows の amd64 用、もう 1 つは Darwin の amd64 用といったイメージをマニフェストリストとして生成することもできます。
manifest inspect
$ docker manifest inspect --help
Usage: docker manifest inspect [OPTIONS] [MANIFEST_LIST] MANIFEST
Display an image manifest, or manifest list
Options:
--help Print usage
--insecure Allow communication with an insecure registry
-v, --verbose Output additional info including layers and platform
manifest create
Usage: docker manifest create MANIFEST_LIST MANIFEST [MANIFEST...]
Create a local manifest list for annotating and pushing to a registry
Options:
-a, --amend Amend an existing manifest list
--insecure Allow communication with an insecure registry
--help Print usage
manifest annotate
Usage: docker manifest annotate [OPTIONS] MANIFEST_LIST MANIFEST
Add additional information to a local image manifest
Options:
--arch string Set architecture
--help Print usage
--os string Set operating system
--os-version string Set operating system version
--os-features stringSlice Set operating system feature
--variant string Set architecture variant
manifest push
Usage: docker manifest push [OPTIONS] MANIFEST_LIST
Push a manifest list to a repository
Options:
--help Print usage
--insecure Allow push to an insecure registry
-p, --purge Remove the local manifest list after push
セキュアでないレジストリの操作
マニフェストに関するコマンドは Docker レジストリとの間で独自にやりとりを行います。
このためセキュアでないレジストリであっても接続を認めるかどうかを Engine に対して問い合わせる手段を持っていません。
CLI においてセキュアでないレジストリへの接続を許可するため、docker manifest
の中には--insecure
フラグを持つものがあります。
create
のようにレジストリへのクエリーを行うトランザクションに対しては--insecure
フラグの指定がなければなりません。
このフラグは、レジストリに対する呼び出し時に、証明書がなかったり自己署名の証明書であったりしても、そういったセキュリティ上のリスクを無視する場合があることを CLI に対して伝えるものです。
同様にしてmanifest push
をセキュアでないレジストリに対して実行する際も、--insecure
フラグの指定が必要になります。
セキュアでないレジストリに対してこのフラグをつけずにコマンド実行すると、マニフェストに関するコマンドはデフォルトで要求される条件を満たすレジストリが見つからなかったとして失敗します。
本コマンドの利用例については、以下に示す 利用例の節 を参照してください。
利用例
イメージ内のマニフェストオブジェクトの確認
$ docker manifest inspect hello-world
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1520,
"digest": "sha256:1815c82652c03bfd8644afda26fb184f2ed891d921b20a0703b46768f9755c57"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 972,
"digest": "sha256:b04784fba78d739b526e27edc02a5a8cd07b1052e9283f5fc155828f4b614c28"
}
]
}
イメージ内のマニフェストと OS/アーキテクチャー情報の確認
docker manifest inspect
コマンドには任意のフラグとして--verbose
があり、イメージ名(Ref)、アークテクチャーと OS(Platform)を表示します。
イメージ名を取り扱う Docker コマンドと同じく、イメージの参照にあたってタグはつけてもつけなくてもよく、またダイジェスト値により参照することもできます(つまりhello-world@sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f
など)。
以下に示す例は、イメージのマニフェスト確認にあたって--verbose
フラグを利用したものです。
$ docker manifest inspect --verbose hello-world
{
"Ref": "docker.io/library/hello-world:latest",
"Digest": "sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f",
"SchemaV2Manifest": {
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1520,
"digest": "sha256:1815c82652c03bfd8644afda26fb184f2ed891d921b20a0703b46768f9755c57"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 972,
"digest": "sha256:b04784fba78d739b526e27edc02a5a8cd07b1052e9283f5fc155828f4b614c28"
}
]
},
"Platform": {
"architecture": "amd64",
"os": "linux"
}
}
マニフェストリストの生成とプッシュ
マニフェストリストを生成するには、まずローカルにてマニフェストリストを生成するcreate
コマンドを実行します。
その実行において、マニフェストリストに含めたいイメージを指定します。
このマニフェストリストはレジストリにプッシュされるものです。
したがって Docker レジストリ以外のレジストリにプッシュを行うのであれば、レジストリ名、IP、ポートを含めてマニフェストリストを生成します。
これはイメージにタグづけを行って Docker レジストリ以外のレジストリにプッシュする場合と同様です。
マニフェストリストのコピーをローカルに生成したら、任意の操作としてそのリストに注釈を追加するannotate
を実行できます。
注釈として追加できる内容は、アーキテクチャーとオペレーティングシステム(イメージが持つ現在値を上書きします)、OS 機能、アークテクチャーバリアントです。
最後にマニフェストリストをpush
コマンドにより目的のレジストリにプッシュします。
以下に示すのはここまでの 3 つのコマンドの説明と、それらを合わせた利用例です。
$ docker manifest create 45.55.81.106:5000/coolapp:v1 \
45.55.81.106:5000/coolapp-ppc64le-linux:v1 \
45.55.81.106:5000/coolapp-arm-linux:v1 \
45.55.81.106:5000/coolapp-amd64-linux:v1 \
45.55.81.106:5000/coolapp-amd64-windows:v1
Created manifest list 45.55.81.106:5000/coolapp:v1
$ docker manifest annotate 45.55.81.106:5000/coolapp:v1 45.55.81.106:5000/coolapp-arm-linux --arch arm
$ docker manifest push 45.55.81.106:5000/coolapp:v1
Pushed manifest 45.55.81.106:5000/coolapp@sha256:9701edc932223a66e49dd6c894a11db8c2cf4eccd1414f1ec105a623bf16b426 with digest: sha256:f67dcc5fc786f04f0743abfe0ee5dae9bd8caf8efa6c8144f7f2a43889dc513b
Pushed manifest 45.55.81.106:5000/coolapp@sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f with digest: sha256:b64ca0b60356a30971f098c92200b1271257f100a55b351e6bbe985638352f3a
Pushed manifest 45.55.81.106:5000/coolapp@sha256:39dc41c658cf25f33681a41310372f02728925a54aac3598310bfb1770615fc9 with digest: sha256:df436846483aff62bad830b730a0d3b77731bcf98ba5e470a8bbb8e9e346e4e8
Pushed manifest 45.55.81.106:5000/coolapp@sha256:f91b1145cd4ac800b28122313ae9e88ac340bb3f1e3a4cd3e59a3648650f3275 with digest: sha256:5bb8e50aa2edd408bdf3ddf61efb7338ff34a07b762992c9432f1c02fc0e5e62
sha256:050b213d49d7673ba35014f21454c573dcbec75254a08f4a7c34f66a47c06aba
マニフェストリストの確認
$ docker manifest inspect coolapp:v1
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 424,
"digest": "sha256:f67dcc5fc786f04f0743abfe0ee5dae9bd8caf8efa6c8144f7f2a43889dc513b",
"platform": {
"architecture": "arm",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 424,
"digest": "sha256:b64ca0b60356a30971f098c92200b1271257f100a55b351e6bbe985638352f3a",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 425,
"digest": "sha256:df436846483aff62bad830b730a0d3b77731bcf98ba5e470a8bbb8e9e346e4e8",
"platform": {
"architecture": "ppc64le",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 425,
"digest": "sha256:5bb8e50aa2edd408bdf3ddf61efb7338ff34a07b762992c9432f1c02fc0e5e62",
"platform": {
"architecture": "s390x",
"os": "linux"
}
}
]
}
セキュアでないレジストリへのプッシュ
以下の例はマニフェストリストを生成して、セキュアでないことがわかっているレジストリにプッシュするものです。
$ docker manifest create --insecure myprivateregistry.mycompany.com/repo/image:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-ppc64le:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-s390x:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-arm:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-armhf:1.0 \
myprivateregistry.mycompany.com/repo/image-windows-amd64:1.0 \
myprivateregistry.mycompany.com/repo/image-linux-amd64:1.0
$ docker manifest push --insecure myprivateregistry.mycompany.com/repo/image:tag
メモ
--insecure
フラグはマニフェストリストに annotate する際には必要ありません。 注釈はローカルに保存されたマニフェストリストのコピーに対して行われるためです。 またdocker manifest inspect
もローカル保存されたマニフェストリストに対しての処理であるため--insecure
はつける必要がありません。 なおローカルに保存されているマニフェストリストは、docker pull
を実行しても Engine がこれを利用することはありません。
上位コマンド
コマンド | 説明 |
---|---|
docker | Docker CLI の基本コマンド |
下位コマンド
コマンド | 説明 |
docker manifest annotate | ローカルイメージのマニフェストに追加情報を加えます。 |
docker manifest create | 追加情報のため、およびレジストリへのプッシュのため、ローカルマニフェストの一覧を生成します。 |
docker manifest inspect | イメージのマニフェストまたはその一覧を表示します。 |
docker manifest push | マニフェスト一覧をリポジトリにプッシュします。 |
docker manifest rm | ローカルストレージから 1 つまたは複数のマニフェストリストを削除します。 |