🍙

PodmanでAzure Container Registry (ACR)間のコンテナイメージを移行する

に公開

はじめに

本記事では,PodmanとAzure CLIを使用してAzure Container Registry (ACR)間でコンテナイメージを移行する手順を記しています.この作業がややこしかったので,備忘録として残します.

なぜPodman?

Dockerライセンスの制限

Docker Desktop は2021年8月31日以降,以下の条件で商業利用に有料ライセンスが必要になりました:

  • 企業規模: 従業員250人以上の企業
  • 年間売上: 1000万ドル以上の企業
  • 政府機関: 政府系組織

これらの条件に該当する組織では,Docker Desktop の商業利用にDocker Pro,Team,またはBusinessライセンス(月額5ドル〜)が必要です.

Podmanの優位性

Podman(Pod Manager) はRed Hatが開発したオープンソースのコンテナエンジンで,以下の利点があります:

  • 完全無料: 商業利用でもライセンス費用が不要
  • Docker互換: Dockerコマンドとほぼ同じ構文で使用可能
  • デーモンレス: バックグラウンドサービスが不要でセキュリティ面で優秀
  • ルートレス実行: root権限なしでコンテナを実行可能
  • Kubernetesネイティブ: Pod概念をサポート

というわけで,Podmanを使用しております.
以下本題です.


前提条件

  • Azure CLI がインストール済み
  • Podman がインストール済み
  • 適切なAzureサブスクリプションへのアクセス権限
  • 移行元・移行先のACRへのアクセス権限

手順

以下,Azure Container RegistryはACRと略します.

1. Azureテナントにログイン

特定のテナントを指定してログインします:

az login --tenant <tenant-id>

例:

# ドメイン名
az login --tenant contoso.onmicrosoft.com
# または テナントID
az login --tenant 12345678-1234-1234-1234-123456789012

ログイン後,適切なサブスクリプションが選択されていることを確認してください:
※ 多分ログイン時にサブスクリプションを聞かれると思います.

az account show

必要に応じてサブスクリプションを変更:

az account set --subscription <subscription-id>

2. 利用可能なACRを確認

az acr list --output table

移行元と移行先のACR名を確認します.

3. 移行元ACRにログインしてトークンを取得

az acr login -n <source-acr-name> --expose-token

例:

az acr login -n sourceacr123 --expose-token

これでとても長いアクセストークンが出力されます.
他にも出力されますが,とりあえず使うのはアクセストークンのみです.
出力されたアクセストークンをコピーしておきます.

4. 移行先ACRにPodmanでログイン

podman login <destination-acr-name>.azurecr.io -u 00000000-0000-0000-0000-000000000000 -p <access-token>

例:

podman login destinationacr456.azurecr.io -u 00000000-0000-0000-0000-000000000000 -p eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiI...

5. 移行元ACRからイメージをPull

podman pull <source-acr-name>.azurecr.io/<repository>/<image-name>:<tag>

Pull用のコマンドはACR上で確認することができます.
Docker Pullコマンドが記されていますので,dockerの部分をpodmanに変えればOKです.

例:

podman pull sourceacr123.azurecr.io/my-project/web-app:v1.0.0

6. 移行先ACR用にイメージをタグ付け

podman tag <source-acr-name>.azurecr.io/<repository>/<image-name>:<tag> <destination-acr-name>.azurecr.io/<repository>/<image-name>:<tag>

例:

podman tag sourceacr123.azurecr.io/my-project/web-app:v1.0.0 destinationacr456.azurecr.io/my-project/web-app:v1.0.0

7. 移行先ACRにイメージをPush

podman push <destination-acr-name>.azurecr.io/<repository>/<image-name>:<tag>

例:

podman push destinationacr456.azurecr.io/my-project/web-app:v1.0.0

確認

移行完了後,以下のコマンドで正常にプッシュされたことを確認できます:

# ローカルのイメージ一覧を確認
podman images | grep <destination-acr-name>

#  Azure CLI でACRのリポジトリを確認
az acr repository list --name <destination-acr-name>

もしくはAzure Portalで直接確認します.

注意点

  • 移行元ACRからのpullには適切な読み取り権限が必要です
  • 移行先ACRへのpushには適切な書き込み権限が必要です
  • 大きなイメージの場合,ネットワーク状況によっては時間がかかる場合があります
  • 複数のイメージを移行する場合は,手順5~7を繰り返してください(1~4のログイン手順は一回だけでOK)

トラブルシューティング

認証エラーが発生した場合

  • az login で再度ログインしてください
  • 正しいサブスクリプションが選択されていることを確認してください
  • ACRへのアクセス権限を確認してください

接続エラーが発生した場合

  • Podmanが正常に起動していることを確認してください
  • podman machine start でPodman VMを起動してください

Discussion