はじめに
この実験では、docker buildx imagetools inspectコマンドを使用して Docker イメージの詳細情報を確認する方法を学びます。シングルプラットフォームイメージとマルチプラットフォームイメージの両方を調査し、それらの設定、レイヤー、メタデータを表示する方法を実演します。
また、Go テンプレートを使用して検査結果をフォーマットし、カスタマイズされたビューを作成する方法や、イメージの構造を完全に理解するために生の JSON マニフェストを表示する方法についても学びます。
単一プラットフォームイメージの調査
このステップでは、docker image inspectコマンドを使用してシングルプラットフォームの Docker イメージを検査する方法を学びます。このコマンドは、イメージの設定、レイヤー、メタデータなど、詳細な情報を提供します。
まず、シンプルなシングルプラットフォームイメージをプルしましょう。この例ではhello-worldイメージを使用します。
docker pull hello-world
イメージがプルされていることを示す出力が表示されます。
Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
イメージを取得したので、検査できます。イメージ名の後にdocker image inspectコマンドを使用します。
docker image inspect hello-world
このコマンドは、hello-worldイメージに関する様々な詳細を含む大きな JSON オブジェクトを出力します。イメージ ID、作成日、アーキテクチャ、オペレーティングシステム、設定などの情報が表示されます。
[
{
"Id": "sha256:...",
"RepoTags": [
"hello-world:latest"
],
"RepoDigests": [
"hello-world@sha256:..."
],
"Parent": "",
"Comment": "",
"Created": "...",
"Container": "...",
"ContainerConfig": {
...
},
"DockerVersion": "...",
"Author": "",
"Config": {
...
},
"Architecture": "amd64",
"Os": "linux",
"Size": ...,
"VirtualSize": ...,
"GraphDriver": {
...
},
"RootFS": {
...
},
"Metadata": {
...
}
}
]
出力は JSON 配列です。これは、コマンドが複数のイメージ名を引数として受け取ることができるため、単一のイメージを検査する場合でも配列形式で出力されます。
マルチプラットフォームイメージの調査
このステップでは、マルチプラットフォームの Docker イメージを検査する方法を学びます。マルチプラットフォームイメージは、異なるアーキテクチャやオペレーティングシステムで動作するように設計されています。マルチプラットフォームイメージをプルすると、Docker は自動的にシステムのアーキテクチャに適した正しいイメージを選択します。
まず、マルチプラットフォームイメージをプルしましょう。軽量な Linux ディストリビューションであるalpineイメージを使用します。
docker pull alpine
前のステップと同様に、イメージがプルされていることを示す出力が表示されます。
Using default tag: latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
次に、docker image inspectコマンドを使用してalpineイメージを検査します。
docker image inspect alpine
出力は再び JSON オブジェクトになります。ArchitectureとOsフィールドに注目してください。これらは、特定の環境向けにプルされたイメージのアーキテクチャとオペレーティングシステムを反映しています。
[
{
"Id": "sha256:...",
"RepoTags": [
"alpine:latest"
],
"RepoDigests": [
"alpine@sha256:..."
],
"Parent": "",
"Comment": "",
"Created": "...",
"Container": "...",
"ContainerConfig": {
...
},
"DockerVersion": "...",
"Author": "",
"Config": {
...
},
"Architecture": "amd64",
"Os": "linux",
"Size": ...,
"VirtualSize": ...,
"GraphDriver": {
...
},
"RootFS": {
...
},
"Metadata": {
...
}
}
]
inspectコマンドは、プラットフォーム向けにプルされた特定のイメージの詳細を表示しますが、このデフォルトビューではイメージがサポートする全てのプラットフォームに関する情報を直接表示しません。後のステップで、イメージマニフェストに関するより詳細な情報を確認する方法を探求します。
Go テンプレートを使用した出力のフォーマット
このステップでは、Go テンプレートを使用してdocker image inspectコマンドの出力をフォーマットする方法を学びます。これにより、大きな JSON 出力から特定の情報を抽出し、より読みやすい形式で表示できます。
docker image inspectコマンドは--formatフラグをサポートしており、Go テンプレート文字列を引数として受け取ります。Go テンプレートでは、ドット表記を使用して JSON 出力内のフィールドにアクセスできます。
alpineイメージを再度検査しますが、今回はイメージ ID とアーキテクチャのみを表示するように出力をフォーマットします。
docker image inspect --format 'ID: {{.Id}}, Architecture: {{.Architecture}}' alpine
このコマンドでは、{{.Id}}が JSON 出力のIdフィールドに、{{.Architecture}}がArchitectureフィールドにアクセスします。
プルされたイメージの ID とアーキテクチャを示す、次のような出力が表示されます:
ID: sha256:..., Architecture: amd64
ネストされたフィールドにもアクセスできます。例えば、メインオブジェクト内にあるオペレーティングシステムを取得するには、{{.Os}}を使用します。ID、アーキテクチャ、オペレーティングシステムを表示してみましょう。
docker image inspect --format 'ID: {{.Id}}, Architecture: {{.Architecture}}, OS: {{.Os}}' alpine
出力にはオペレーティングシステムも含まれるようになります:
ID: sha256:..., Architecture: amd64, OS: linux
Go テンプレートにはループや条件文などのより高度な機能もありますが、フィールドの単純な抽出にはドット表記で十分です。このフォーマットは、特定のイメージプロパティに基づいて操作をスクリプト化する必要がある場合に非常に便利です。
生の JSON マニフェストを表示
このステップでは、Docker イメージの生の JSON マニフェストを表示する方法を学びます。マニフェストは、イメージに関する詳細な情報を提供し、マルチプラットフォームイメージの場合、異なるアーキテクチャ向けのレイヤーや設定を含みます。
生のマニフェストを表示するには、docker manifest inspectコマンドを使用します。このコマンドは特にマルチプラットフォームイメージを理解するのに役立ちます。
先ほどプルしたalpineイメージのマニフェストを検査してみましょう。
docker manifest inspect alpine
このコマンドは、イメージマニフェストを表す JSON オブジェクトを出力します。alpineのようなマルチプラットフォームイメージの場合、このマニフェストは「マニフェストリスト」(「インデックス」とも呼ばれます)になります。このリストには、サポートされている各アーキテクチャ向けのエントリが含まれており、そのアーキテクチャ向けの特定のイメージマニフェストを指しています。
次のような出力が表示されます(正確な内容はイメージのバージョンや Docker の設定によって若干異なる場合があります):
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": ...,
"digest": "sha256:...",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": ...,
"digest": "sha256:...",
"platform": {
"architecture": "arm",
"os": "linux",
"variant": "v6"
}
},
...
]
}
manifests配列に注目してください。この配列の各オブジェクトは、特定のプラットフォーム(アーキテクチャと OS)向けの具体的なイメージを表しています。各エントリのplatformフィールドには、アーキテクチャとオペレーティングシステムが示されています。digestフィールドは、その特定のプラットフォームイメージのマニフェストの一意識別子です。
この生のマニフェストは、マルチプラットフォームイメージがどのように構成されているかをより深く理解するのに役立ち、単一のタグの下で利用可能なすべての異なるバリアントを見ることができます。
まとめ
この実験では、docker image inspectコマンドを使用して Docker イメージの詳細を調査する方法を学びました。まず単一プラットフォームイメージ(具体的にはhello-worldイメージ)を調査し、このコマンドがイメージ ID、アーキテクチャ、OS、設定などの情報を含む包括的な JSON 出力を提供することを確認しました。
次に、マルチプラットフォームイメージの調査に進み、そのようなイメージの出力にはサポートされている異なるプラットフォームに関する詳細が含まれることを理解しました。最後に、Go テンプレートを使用して特定の情報を抽出する方法と、イメージの構造をより深く理解するために生の JSON マニフェストを表示する方法を探求しました。



