Dataflow でカスタム コンテナを使用する場合、コンテナがワーカー VM のアーキテクチャと一致している必要があります。このドキュメントでは、x86 VM と Arm VM の両方と互換性のあるマルチアーキテクチャ コンテナを作成する方法について説明します。
コンテナ イメージをビルドするには、Docker CLI または Cloud Build を使用します。
Docker を使用してイメージをビルドする
Dockerfile を作成します。
FROM
命令を使用して、マルチアーキテクチャ ベースイメージを指定します。FROM apache/beam_python3.10_sdk:2.50.0 # Make your customizations here, for example: ENV FOO=/bar COPY path/to/myfile ./
Buildx ツールをインストールします。ツールがインストールされているかどうかを確認するには、次のコマンドを実行します。
docker buildx version
次のコマンドを実行して、
docker-container
ドライバを使用するビルダー インスタンスを作成します。このドライバは、マルチアーキテクチャ イメージのビルドに必要です。docker buildx create --driver=docker-container --use
--use
フラグを使用して、新しいビルダー インスタンスを現在のビルダーとして設定します。次のコマンドを実行して、Artifact Registry へのリクエストを認証するように Docker を構成します。
gcloud auth configure-docker REGION-docker.pkg.dev
REGION は、Artifact Registry リポジトリのリージョンに置き換えます。
次のコマンドを実行してコンテナ イメージをビルドし、Artifact Registry に push します。
docker buildx build \ --platform=linux/amd64,linux/arm64 \ -t REGISTRY/IMAGE:TAG \ --push .
次のように置き換えます。
- REGISTRY: Docker リポジトリ
- IMAGE: イメージ名
- TAG: イメージタグ
Cloud Build を使用してイメージをビルドする
Dockerfile を作成します。
FROM
命令を使用して、マルチアーキテクチャ ベースイメージを指定します。FROM apache/beam_python3.10_sdk:2.50.0 # Make your customizations here, for example: ENV FOO=/bar COPY path/to/myfile ./
Dockerfile が存在するディレクトリに、
docker_buildx.yaml
という名前のファイルを作成します。次のテキストを貼り付けます。steps: - name: 'docker' args: ['buildx', 'create', '--driver', 'docker-container', '--name', 'container', '--use'] - name: 'docker' args: ['buildx', 'build', '--platform', 'linux/amd64,linux/arm64', '-t', 'REGISTRY/IMAGE:TAG', '--push', '.']
次のように置き換えます。
- REGISTRY: Docker リポジトリ
- IMAGE: イメージ名
- TAG: イメージタグ
イメージをビルドして push するには、
gcloud builds submit
コマンドを実行します。gcloud builds submit --region=REGION --config docker_buildx.yaml
REGION は、使用する Cloud Build サービスのリージョンに置き換えます。
詳細については、Cloud Build で Docker イメージをビルドして push するをご覧ください。
コンテナ イメージを確認する
Google Cloud コンソールで [リポジトリ] ページを開きます。
コンテナ イメージのあるリポジトリをクリックします。
イメージをクリックすると、そのバージョンが表示されます。
バージョンをクリックします。
[マニフェスト] をクリックします。
マニフェスト ファイルの
platform
セクションには、arm64
とamd64
のエントリが必要です。例:{ "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "digest": "sha256:441d5438885049e2b388523a8cb5b77ea829c3c3f53326fb221fe185abd67f07", "size": 3074, "platform": { "architecture": "amd64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "digest": "sha256:d3b98b0f8f3f555f5453c79b240bd2b862d4f52d853fe81bae55f01a663de29c", "size": 3073, "platform": { "architecture": "arm64", "os": "linux" } } ] }