はじめに
この実験では、Docker イメージビルドに関連付けられたアタッチメントを調査するためにdocker buildx history inspect attachmentコマンドを使用する方法を学びます。まず、Docker イメージをビルドし、--attestフラグを使用してファイルをアタッチすることから始めます。
ビルド後、ビルド履歴をリストアップしてアタッチメントを含むビルドの参照 (reference) を特定する方法を探ります。最後に、取得した参照を使用してアタッチされたファイルを検査する練習を行い、さらにアタッチメントタイプとプラットフォームを指定して検査を絞り込みます。この実践的な経験を通じて、Docker イメージに埋め込まれたメタデータにアクセスし検証する方法を実証します。
アタッチメント付きイメージのビルド
このステップでは、Docker イメージをビルドし、メタデータをアタッチする方法を学びます。アタッチメントは、ビルドの出所 (provenance)、ソフトウェア部品表 (SBOM)、その他の関連データなど、追加情報をイメージに含める方法です。
まず、シンプルな Dockerfile を作成しましょう。まだ~/projectディレクトリにいない場合は移動します。
cd ~/project
次に、nanoエディタを使用してDockerfileという名前のファイルを作成します。
nano Dockerfile
Dockerfileに以下の内容を追加します:
FROM alpine:latest
CMD ["echo", "Hello, Docker Attachments!"]
この Dockerfile は非常にシンプルです。ベースイメージとしてalpine:latestを使用し、コンテナ起動時にメッセージを表示するコマンドを定義しています。
ファイルを保存し、nanoを終了します(Ctrl + X、次にY、そしてEnterを押します)。
次に、イメージにアタッチするファイルを作成します。attachment.txtという名前のシンプルなテキストファイルを作成しましょう。
nano attachment.txt
attachment.txtに以下のような内容を追加します:
This is an example attachment for the Docker image.
It can contain any relevant metadata.
ファイルを保存し、nanoを終了します。
ここで、Docker イメージをビルドし、attachment.txtファイルをアタッチします。docker buildコマンドに--attestフラグを使用します。--attestフラグは、イメージビルドに含めるアタッチメントを指定できます。フォーマットはtype=type,dest=destination,src=sourceです。
今回は、タイプとしてtype=sbom(Software Bill of Materials)、アタッチメント内の宛先パスとしてdest=/sbom/attachment.txt、ローカルファイルシステムのソースファイルとしてsrc=attachment.txtを使用します。また、イメージにmy-attached-image:latestというタグを付けます。
ビルド前に、必要な buildx プラグインがインストールされていることを確認してください。インストールされていない場合は必要になるかもしれませんが、基本的なアタッチメントの場合は組み込みのビルダーで十分です。
イメージをビルドしましょう:
docker build -t my-attached-image:latest --attest type=sbom,dest=/sbom/attachment.txt,src=attachment.txt .
コマンド末尾の.はビルドコンテキスト(現在のディレクトリ~/project)を指定しています。
イメージがビルドされ、アタッチメントが処理されていることを示す出力が表示されるはずです。
ビルドが完了したら、ローカルイメージをリスト表示してイメージが作成されたことを確認できます。
docker images
リストにmy-attached-imageが表示されるはずです。
ビルド履歴をリスト表示して参照を特定
前のステップでは、アタッチメント付きの Docker イメージをビルドしました。ここでは、このアタッチメントを検査するための参照 (reference) を特定する必要があります。アタッチメントは最終的なイメージタグではなく、ビルド履歴に関連付けられています。
イメージとその関連アタッチメントの情報を確認するには、docker buildx imagetools inspectコマンドを使用します。このコマンドにはイメージ参照が必要です。
ビルドしたmy-attached-image:latestイメージを検査してみましょう。
docker buildx imagetools inspect my-attached-image:latest
このコマンドはイメージマニフェストの詳細情報を出力します。出力内のattestationsセクションを探してください。このセクションにはイメージに関連付けられたアタッチメントがリストされています。
attestationsセクション内には、各アタッチメントのエントリがあります。各エントリにはrefフィールドがあります。このrefがアタッチメントの内容を検査するために必要な参照です。sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxのような形式になります。
追加したアタッチメント(type=sbomのもの)のrefフィールドの値をコピーしてください。この参照を次のステップで使用します。
例えば、出力が以下のようになっている場合:
{
"manifest": {
...
},
"attestations": [
{
"ref": "sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890",
"type": "sbom",
"platform": {
"architecture": "amd64",
"os": "linux"
}
}
]
}
必要な参照はsha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890です。実際の参照は異なることに注意してください。
この参照を次のステップのために控えておいてください。
参照を使用してアタッチメントを検査
前のステップでは、docker buildx imagetools inspectを使用して Docker イメージに関連付けられたアタッチメントの参照 (reference) を特定しました。ここでは、この参照を使用してアタッチメントの内容を検査します。
特定のアタッチメントの詳細を確認するには、docker buildx attestation inspectコマンドとその参照を使用します。
前のステップで取得した参照を思い出してください。sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxという形式になっているはずです。
<attachment_reference>を実際にコピーした参照に置き換えてください。
docker buildx attestation inspect <attachment_reference>
例えば、参照がsha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890の場合、コマンドは次のようになります:
docker buildx attestation inspect sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890
このコマンドはアタッチメントの内容を出力します。ステップ 1 でattachment.txtファイルに追加したテキストが表示されるはずです。
出力には、アタッチメントに関するメタデータと実際の内容が含まれます。"This is an example attachment..."というテキストを含むセクションを探してください。
これにより、一意の参照を使用してアタッチメントの内容を取得する方法が示されます。これは添付データの整合性と内容を検証するのに役立ちます。
タイプとプラットフォームを指定してアタッチメントを検査
前のステップでは、直接参照を使用してアタッチメントを検査しました。しかし、アタッチメントタイプとビルド対象プラットフォームを指定することで、イメージに関連付けられたアタッチメントを検査することも可能です。これは、イメージが異なるタイプやアーキテクチャ向けの複数のアタッチメントを持っている場合に特に便利です。
再びdocker buildx attestation inspectコマンドを使用しますが、今回はイメージ参照、アタッチメントタイプ、プラットフォームを指定します。
イメージ参照はmy-attached-image:latestです。
使用したアタッチメントタイプはsbomです。
LabEx 環境でのビルドプラットフォームは通常linux/amd64です。
コマンド形式はdocker buildx attestation inspect <image_reference> --type <attachment_type> --platform <platform>です。
この方法でアタッチメントを検査してみましょう:
docker buildx attestation inspect my-attached-image:latest --type sbom --platform linux/amd64
このコマンドも前のステップと同様にアタッチメントの内容を出力するはずです。これにより、イメージ、タイプ、プラットフォームを指定してアタッチメント情報を取得できることが確認できます。
この方法は、探しているアタッチメントのタイプとイメージのプラットフォームがわかっている場合に便利で、imagetools inspectを使用して特定のアタッチメント参照を最初に見つける必要がありません。
これで、アタッチメント付きの Docker イメージをビルドする方法と、そのアタッチメントを直接参照またはイメージ、タイプ、プラットフォームを指定して検査する方法を学びました。
まとめ
この実験では、docker buildコマンドに--attestフラグを追加して、アタッチメントタイプ、アタッチメント内の保存先、およびソースファイルを指定することで、ファイルを添付した Docker イメージをビルドする方法を学びました。その後、docker buildx historyを使用してビルド履歴をリストアップし、アタッチメントを含むビルドの参照 (reference) を特定しました。
最後に、docker buildx history inspect attachmentコマンドを使用して添付ファイルを検査する方法を実践しました。最初にビルド参照とアタッチメント保存先を指定し、その後より詳細な検査のためにアタッチメントタイプとプラットフォームも追加指定しました。このプロセスを通じて、Docker イメージビルドに関連付ける追加メタデータの包含方法とアクセス方法を確認しました。



