はじめに
この実験では、Docker イメージを結合してタグ付けするためにdocker buildx imagetools createコマンドを効果的に使用する方法を学びます。複数のソースイメージからコンテンツを統合して新しいイメージを作成するプロセスを実践的に体験します。これは複雑なアプリケーションを構築する際によく行われる手法です。
さらに、新しく作成したイメージにタグを付ける方法、--dry-runフラグを使用してプッシュせずに最終的なイメージ構造をプレビューする方法、およびイメージインデックスに有益なアノテーションを追加して整理とメタデータ管理を改善する方法について探求します。この実験を終える頃には、高度なイメージ操作と管理のためにdocker buildx imagetools createを活用する方法について確固たる理解が得られるでしょう。
複数のソースイメージから新しいイメージを作成
このステップでは、複数のソースイメージのコンテンツを組み合わせて新しい Docker イメージを作成する方法を学びます。これは、異なるベースイメージや事前ビルドされたイメージからコンポーネントを含むイメージを構築する必要がある場合によくあるシナリオです。
まず、必要なソースイメージをプルします。例としてubuntuとalpineイメージを使用します。
docker pull ubuntu:latest
docker pull alpine:latest
イメージがプルされていることを示す出力が表示されます。
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
次に、Dockerfileを使用して新しいイメージを作成します。Dockerfileは、イメージを構築するためにコマンドラインで呼び出す可能性のあるすべてのコマンドを含むテキストドキュメントです。~/projectディレクトリにDockerfileという名前の新しいファイルを作成します。
nano ~/project/Dockerfile
Dockerfileに以下の内容を追加します:
FROM ubuntu:latest AS base
FROM alpine:latest AS alpine_base
COPY --from=alpine_base /etc/alpine-release /app/alpine-release
COPY --from=base /etc/os-release /app/ubuntu-release
WORKDIR /app
CMD ["ls", "-l"]
このDockerfileを分解してみましょう:
FROM ubuntu:latest AS base: この行は、ビルドの最初のステージのベースイメージをubuntu:latestに設定し、このステージにbaseという名前を付けます。FROM alpine:latest AS alpine_base: この行は、alpine:latestをベースイメージとして新しいビルドステージを開始し、このステージにalpine_baseという名前を付けます。これはマルチステージビルドであり、ステージ間でファイルをコピーできます。COPY --from=alpine_base /etc/alpine-release /app/alpine-release: このコマンドは、alpine_baseステージから/etc/alpine-releaseファイルを現在のステージの/app/alpine-releaseディレクトリにコピーします。COPY --from=base /etc/os-release /app/ubuntu-release: このコマンドは、baseステージから/etc/os-releaseファイルを現在のステージの/app/ubuntu-releaseディレクトリにコピーします。WORKDIR /app: これにより、後続の命令の作業ディレクトリが/appに設定されます。CMD ["ls", "-l"]: これは、このイメージからコンテナが起動されたときに実行されるデフォルトのコマンドを指定します。/appディレクトリの内容をリスト表示します。
Dockerfileを保存するには、Ctrl + X、次にY、そしてEnterを押します。
次に、docker buildコマンドを使用してイメージをビルドします。コマンドの最後の.は、ビルドコンテキスト(現在のディレクトリ~/project)を指定します。
docker build -t my-multi-stage-image:latest ~/project
ビルドプロセスを示す出力が表示され、実行されるさまざまなステージが含まれます。
[+] Building
...
Successfully built <image_id>
Successfully tagged my-multi-stage-image:latest
ビルドが完了したら、ローカルイメージをリスト表示してイメージが作成されたことを確認できます。
docker images my-multi-stage-image
新しく作成したイメージがリストに表示されます。
REPOSITORY TAG IMAGE ID CREATED SIZE
my-multi-stage-image latest <image_id> About a minute ago ...MB
最後に、このイメージからコンテナを実行してコピーされたファイルを確認しましょう。
docker run --rm my-multi-stage-image:latest
--rmフラグは、コンテナが終了したときに自動的に削除します。出力には、ubuntuとalpineイメージからコピーされたファイルが表示されます。
total 8
-rw-r--r-- 1 root root 25 Aug 24 10:00 alpine-release
-rw-r--r-- 1 root root 281 Aug 24 10:00 ubuntu-release
これにより、マルチステージビルドを使用して複数のソースイメージからコンテンツを組み合わせてイメージを正常に作成できたことが確認されます。
新規作成したイメージにタグ付け
このステップでは、前のステップで作成した Docker イメージに追加のタグを付ける方法を学びます。イメージにタグを付けることは、バージョン管理、異なるビルドの識別、または特定のリポジトリとの関連付けに役立ちます。
前のステップでは、イメージをビルドし、自動的にmy-multi-stage-image:latestというタグを付けました。ここでは、このイメージに別のタグ(例:my-multi-stage-image:v1.0)を追加します。
docker tagコマンドは、SOURCE_IMAGE を参照する TARGET_IMAGE タグを作成するために使用されます。構文はdocker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]です。
まず、既存のイメージをリスト表示して、my-multi-stage-image:latestのイメージ ID を確認します。
docker images my-multi-stage-image
以下のような出力が表示され、<image_id>がイメージの一意の識別子となります:
REPOSITORY TAG IMAGE ID CREATED SIZE
my-multi-stage-image latest <image_id> ... ...MB
次に、docker tagコマンドを使用して、このイメージにv1.0タグを追加します。ソースとしてイメージ名とタグ(my-multi-stage-image:latest)またはイメージ ID(<image_id>)のどちらかを使用できます。一般的には、名前とタグを使用する方が簡単です。
docker tag my-multi-stage-image:latest my-multi-stage-image:v1.0
このコマンドは、my-multi-stage-image:latestと同じイメージ ID を指す新しいv1.0タグを作成します。コマンドが成功した場合、出力はありません。
新しいタグが追加されたことを確認するために、再度イメージをリスト表示します。
docker images my-multi-stage-image
同じイメージ ID に関連付けられた両方のタグが表示されるはずです:
REPOSITORY TAG IMAGE ID CREATED SIZE
my-multi-stage-image latest <image_id> ... ...MB
my-multi-stage-image v1.0 <image_id> ... ...MB
Docker イメージに新しいタグを正常に追加しました。これにより、同じイメージを異なる名前やバージョンで参照できるようになります。
--dry-run を使用してプッシュせずに最終イメージを表示
このステップでは、実際にプッシュ操作を行わずに、レジストリにプッシュされる最終イメージの詳細を確認する方法を説明します。これは、イメージを共有する前にマニフェストや設定を検査するのに役立ちます。
docker manifestコマンドを使用すると、イメージマニフェストを検査・管理できます。イメージマニフェストは、イメージのレイヤーや設定、場合によってはマニフェストリスト内のプラットフォーム固有イメージへの参照を含む、イメージを記述した JSON ドキュメントです。
my-multi-stage-image:latestイメージのマニフェストをプッシュせずに表示するには、--dry-runフラグを付けたdocker manifest inspectコマンドを使用します。
docker manifest inspect --dry-run my-multi-stage-image:latest
このコマンドは、イメージマニフェストを JSON 形式でターミナルに出力します。--dry-runフラグにより、コマンドはレジストリに接続したりデータをプッシュしたりする試みを行いません。
出力は、イメージを詳細に記述した JSON 構造になります。イメージの設定、構成レイヤー(ダイジェストで表現)、その他のメタデータなどの情報が含まれます。
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": ...,
"digest": "sha256:..."
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": ...,
"digest": "sha256:..."
},
...
]
}
この出力を調べることで、レジストリで表現されるイメージの構造と内容を理解できます。これは特にデバッグやイメージ構成の検証に役立ちます。
なお、JSON 出力の正確な内容は、イメージのレイヤーや設定によって異なります。
作成したイメージインデックスにアノテーションを追加
このステップでは、イメージインデックス(マニフェストリストとも呼ばれる)にアノテーションを追加する方法を学びます。イメージインデックスは、通常異なるアーキテクチャやオペレーティングシステム向けの複数のイメージマニフェストを参照するために使用されます。インデックスにアノテーションを追加することで、イメージセット全体に関するメタデータを提供できます。
現在のmy-multi-stage-imageは単一アーキテクチャのイメージですが、この場合シンプルなインデックスとして機能するマニフェストにアノテーションを追加する概念を実演できます。
docker manifest annotateコマンドは、マニフェストリスト内の特定のイメージに対してアノテーションを追加または更新するために使用されます。構文はdocker manifest annotate MANIFEST_LIST IMAGE --annotation KEY=VALUEです。
まず、イメージのマニフェストリストを作成しましょう。単一のイメージしかないため、マニフェストリストは既存のイメージを参照するだけになります。docker manifest createコマンドを使用します。
docker manifest create my-multi-stage-image:annotated my-multi-stage-image:latest
このコマンドは、my-multi-stage-image:latestを参照するmy-multi-stage-image:annotatedという新しいマニフェストリストを作成します。成功した場合、出力はありません。
次に、docker manifest annotateコマンドを使用して、my-multi-stage-image:annotatedマニフェストリスト内のmy-multi-stage-image:latestエントリにアノテーションを追加します。オペレーティングシステムを示すアノテーションを追加しましょう。
docker manifest annotate my-multi-stage-image:annotated my-multi-stage-image:latest --annotation "os=linux"
このコマンドは、my-multi-stage-image:annotatedリスト内のmy-multi-stage-image:latestマニフェストエントリにos=linuxアノテーションを追加します。成功時には出力がありません。
アノテーションが追加されたことを確認するには、docker manifest inspectを使用してマニフェストリストを検査します。
docker manifest inspect my-multi-stage-image:annotated
出力はマニフェストリストを表す JSON 構造になります。my-multi-stage-image:latestのエントリ内に追加したアノテーションが表示されるはずです。"manifests"配列内の"annotations"フィールドを探してください。
{
"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"
},
"annotations": {
"os": "linux"
}
}
]
}
イメージインデックスへのアノテーション追加に成功しました。アノテーションは、レジストリやクライアントが扱うイメージについてより理解するための貴重なメタデータを提供します。
まとめ
この実験では、docker buildx imagetools createコマンドを使用してイメージを結合しタグ付けする方法を学びました。マルチステージ Dockerfile を使用して異なるベースイメージ間でファイルをコピーする方法を実演しながら、複数のソースイメージから新しいイメージを作成することから始めました。
イメージ作成後、新しく作成したイメージにタグを付ける方法を探求し、--dry-runフラグを使用してプッシュせずに最終イメージをプレビューしました。最後に、作成したイメージインデックスにアノテーションを追加して、結合されたイメージに追加のメタデータを提供する方法を学びました。



