Arm ベースのマシンにコンテナをデプロイする場合、x86 と Arm アーキテクチャで個別のイメージタグを維持すると、メンテナンスのオーバーヘッドが増加します。Container Registry Enterprise Edition を使用すると、単一のタグで複数の CPU アーキテクチャ向けのイメージをビルドできます。クライアントがイメージをプルすると、レジストリはクライアントのアーキテクチャに一致するバリアントを自動的に提供するため、アーキテクチャ固有のタグは不要です。
仕組み
マルチアーキテクチャイメージは、個々のイメージマニフェストとともにマニフェストリストを格納します。マニフェストリストの各エントリは、特定のアーキテクチャ向けにビルドされたイメージをポイントします。Docker や containerd がタグでイメージをプルすると、マニフェストリストを読み取り、ホストのアーキテクチャに一致するマニフェストのみをフェッチします。
これにより、同じ docker pull コマンドが amd64 サーバーと Arm ベースのマシンの両方で正しく動作します。
前提条件
開始する前に、次のものが揃っていることを確認してください:
Container Registry Enterprise Edition インスタンス。詳細については、「Container Registry Enterprise Edition インスタンスの作成」をご参照ください。
ソースコードホスティングプラットフォームにバインドされたインスタンス。詳細については、「ソースコードホスティングプラットフォームのバインド」をご参照ください。
各ターゲットアーキテクチャで正常にコンパイルされるプロジェクト
サポート対象のアーキテクチャ
| オペレーティングシステム | アーキテクチャ | サポート |
|---|---|---|
| Linux | amd64 | はい (デフォルト) |
| Linux | arm64 | はい |
| Linux | arm/v7 | はい |
| Linux | arm/v6 | はい |
| Windows | amd64 | いいえ |
現在、Windows イメージはサポートされていません。サポートされているすべてのアーキテクチャは Linux 上で実行されます。
単一のアーキテクチャを選択した場合、そのアーキテクチャ用にイメージがビルドされ、指定されたタグでプッシュされます。複数のアーキテクチャを選択した場合、アーキテクチャごとに個別のイメージがビルドされ、同じリポジトリに同じタグでプッシュされます。
ステップ 1:プロジェクトの作成
イメージをビルドする元のソースコードプロジェクトを作成します。次の Go ソースファイルと Dockerfile は、実行されるマシンのアーキテクチャを出力するバイナリを生成します。これは、正しいイメージバリアントがプルされたことを確認するのに役立ちます。
// hello.go として保存
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Printf("Hello, %s!\n", runtime.GOARCH)
}FROM golang:alpine AS builder
RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN go build -o hello hello.go
FROM alpine
RUN mkdir /app
WORKDIR /app
COPY --from=builder /app/hello .
CMD ["./hello"]この Dockerfile はマルチステージビルドを使用しています。golang:alpine ステージでバイナリをコンパイルし、最終的な alpine ステージで最小イメージを生成します。
ステップ 2:イメージリポジトリの作成
イメージリポジトリを作成し、ソースコードプロジェクトにバインドします。プロジェクトからトリガーされたすべてのイメージビルドは、このリポジトリにプッシュされます。
Container Registry コンソールにログインします。
Container Registry コンソールにログインします。
トップナビゲーションバーで、リージョンを選択します。
左側のナビゲーションウィンドウで、[Instances] をクリックします。
[Instances] ページで、管理する Enterprise Edition インスタンスをクリックします。
左側のナビゲーションウィンドウで、[Repository] > [Repositories] を選択します。
[Repositories] ページで、[Create Repository] をクリックします。
[リポジトリ情報] ステップで、[名前空間]、[リポジトリ名]、[リポジトリタイプ]、[タグ]、[イメージアクセラレーション]、[概要]、[説明] を設定します。その後、[次へ] をクリックします。
「コード ソース」ステップで、以下のパラメーターを設定し、「リポジトリの作成」をクリックします。「ビルド設定」オプション:
パラメーター 説明 コードソース リポジトリにバインドするソースコードホスティングプラットフォーム。 ビルド設定 イメージのビルド方法を制御するオプション。下の表をご参照ください。 ビルドルール イメージをいつ、どのようにビルドするかを定義するルール。 オプション 説明 コード変更時にイメージを自動ビルド 設定されたブランチにコードがプッシュされるたびにビルドをトリガーします。 中国本土以外にデプロイされたサーバーを使用した構築 中国本土以外のサーバーでイメージをビルドし、指定されたリージョンにプッシュします。Dockerfile が中国本土以外のソースからベースイメージをプルし、クロスボーダー接続が不安定な場合に有効にします。 キャッシュなしでビルド ビルドごとにベースイメージを新たにプルします。このオプションを有効にすると、ビルドが遅くなる可能性があります。
リポジトリが作成されたら、[Repositories] ページでそのリポジトリをクリックします。リポジトリ管理ページの左側のナビゲーションウィンドウに [Build] が表示されていれば、リポジトリはソースコードリポジトリに正常にバインドされています。
ステップ 3:構築ルールを追加してアーキテクチャを選択
このステップでは、Container Registry にどのブランチからビルドするか、出力イメージにどのようにタグ付けするか、どのアーキテクチャをターゲットにするかを指示する構築ルールを設定します。この例では、構築ルールは linux/amd64 と linux/arm64 をターゲットにしています。
Container Registry コンソール(Container Registry コンソール)にログインします。
Container Registry コンソールにログインします。
トップナビゲーションバーで、リージョンを選択します。
左側のナビゲーションウィンドウで、[Instances] をクリックします。
[Instances] ページで、管理する Enterprise Edition インスタンスをクリックします。
左側のナビゲーションウィンドウで、[Repository] > [Repositories] を選択します。
[Repositories] ページで、対象のイメージリポジトリを見つけ、[操作] 列の [管理] をクリックします。
左側のナビゲーションウィンドウで、[Build] をクリックします。[構築ルール] セクションで、[構築ルールの追加] をクリックします。
[ビルド情報] ステップで、以下のパラメーターを設定し、[次へ] をクリックします。
パラメーター 説明 タイプ 監視するソースコードリファレンスのタイプ。有効な値:[Branch] と [Tag]。 [Branch/Tag] ビルド元のブランチまたはタグ。正規表現がサポートされています。例えば、 release-(?<imageTag>\w*)と指定すると、release-v1のようなブランチにコードがプッシュされたときに自動的にイメージがビルドされ、v1がイメージタグとして使用されます。詳細については、「名前付きキャプチャグループでの正規表現の使用」をご参照ください。説明正規表現を指定すると、イメージはシステムによってのみビルド可能になり、手動ビルドは無効になります。
Dockerfile ディレクトリ ブランチまたはタグ内の Dockerfile を含むサブディレクトリ。例えば、Dockerfile が masterブランチのルートにある場合は、master/Dockerfileと入力します。[Dockerfile Filename] Dockerfile の名前。デフォルトは Dockerfileです。[タグ] ステップで、次のパラメーターを設定し、[保存] をクリックしてから、[次へ] をクリックします。
[設定の追加] をクリックしてイメージタグを追加します。最大 3 つのイメージタグがサポートされています。
パラメーター 説明 イメージタグ ビルドされたイメージのタグです。例えば latestのように指定します。ブランチ/タグ フィールドで名前付きキャプチャグループを使用した場合、そのキャプチャされた値を参照できます。ビルド時間 (オプション) タグにプッシュタイムスタンプ (UTC+08:00) を付加します。例: 20201015、202010151613。この項目を設定した場合、システムのみがビルドをトリガーできます。コミット ID (オプション) 最新のコミット ID の一部をタグに付加します。デフォルトでは、先頭 6 文字が使用されます。この項目を設定した場合、システムのみがビルドをトリガーできます。 [ビルド設定] ステップで、以下のパラメーターを設定し、[確認] をクリックします。
パラメーター 説明 ビルドアーキテクチャ イメージをビルドする対象のアーキテクチャです。複数のアーキテクチャを選択すると、それぞれに対して個別のイメージがビルドされます。すべてのイメージは同一のタグでプッシュされ、マルチアーキテクチャイメージを構成します。 ビルドパラメーター Dockerfile に渡される実行時ビルド引数です。各引数は大文字と小文字を区別するキーと値のペアです。最大 20 個のビルドパラメーターを指定できます。ビルドパラメーターを使用すると、Dockerfile 自体を変更することなく、その環境変数を動的に変更できます。 次のいずれかの方法で構築ルールをトリガーします。左側のナビゲーションウィンドウで [イメージタグ] をクリックして、イメージが作成されたことを確認します。
[ビルド] ページの [構築ルール] セクションで、構築ルールを見つけ、[操作] 列で [ビルド] をクリックします。
ソースコードリポジトリの master ブランチにコミットをプッシュして、ルールを自動的にトリガーします。
実行中のビルドをキャンセルするには、[Build] ページの [ビルドログ] セクションに移動し、ビルドタスクを見つけて、[操作] 列の [キャンセル] をクリックします。ビルドログを表示するには、関連するビルドタスクの [操作] 列にある [ログ] をクリックします。
ステップ 4:結果の確認
イメージリポジトリ管理ページの左側のナビゲーションウィンドウで、[タグ] をクリックします。[main] タグの下に、Linux/AMD64 用と Linux/ARM64 用の 2 つのイメージがリストされます。

各アーキテクチャで正しいイメージバリアントがプルされることを確認します。Linux/AMD64 マシンでは、次のようになります:
docker run --rm xxx-registry.cn-hangzhou.cr.aliyuncs.com/test/golang-test:main期待される出力:
Hello, amd64!Linux/ARM64 マシンでは、次のようになります:
docker run --rm xxx-registry.cn-hangzhou.cr.aliyuncs.com/test/golang-test:main期待される出力:
Hello, arm!
両方のマシンは同じイメージタグを使用します。それぞれが自身のアーキテクチャに一致するバリアントをプルします。
付録:名前付きキャプチャグループでの正規表現の使用
名前付きキャプチャグループは、一致した文字列の一部を抽出し、名前付きキーの下に格納します。その後、テンプレートでこのキーを参照できます。
名前付きキャプチャグループのフォーマットは次のとおりです:
(?<name>Expression)例えば、次の式は release-11-2-10 に一致し、各バージョンコンポーネントを個別にキャプチャします:
release-(?<major>\d*)-(?<minor>\d*)-(?<version>\d*)一致した内容は、major、minor、version という名前のグループに格納されます。次のテンプレートを使用して、11.2.10 として再構成します:
${major}.${minor}.${version}次のステップ
コンソールの代わりにローカルマシンからマルチアーキテクチャイメージをビルドしてプッシュするには、「オンプレミスデバイスでマルチアーキテクチャイメージをビルドし、Container Registry Enterprise Edition インスタンスにプッシュする」をご参照ください。