docker manifest

読む時間の目安: 4 分

説明

Docker イメージのマニフェストとその一覧を管理します。

このコマンドは Docker クライアントにおける試験的なものです。

本番環境では利用しないでください。

Docker CLI において試験的機能を有効にする場合は、config.json ファイルを編集して、experimentalenabled に設定してください。 詳しくは こちら を参照してください。

利用方法

$ 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 つまたは複数のマニフェストリストを削除します。