コンテナレジストリ は、コンテナイメージを保存するためのレポジトリのことで、サービスとして提供している会社がいくつもあります。ただ、それぞれイメージ名の規則やコンテナクライアントの認証方法が異なるため、調べ直すことは多いのではないでしょうか。
この記事では、以下のコンテナレジストリの 認証コマンド と イメージ名の規則 を紹介します。コンテナクライアントとして docker を想定しています。
- Docker Hub
- AWS Elastic Container Registry (ECR)
- Github Container Registry (GHCR)
- Google Cloud Artifact Registry
- Google Cloud Container Registry (GCR)
Docker Hub
docker login
コマンドで認証します。イメージ名は ACCOUNT_NAME/IMAGE_NAME
のフォーマットで書きます。他のレジストリのホスト名をイメージ名の先頭につけることで、そのレジストリにプッシュできますが、つけない場合、デフォルトで registry-1.docker.io のパブリックレジストリを使用するので、会社のパソコンで開発する時には気をつけましょう(私はそもそもログインしないようにしています)
# 認証
docker login
# ビルド/プッシュ
docker build -t hankehly/test-image-1 .
docker push hankehly/test-image-1
AWS Elastic Container Registry (ECR)
Amazon ECRレジストリへの認証に推奨される方法は get-login-password
コマンドです。このコマンドで認証トークンを取得して docker login
コマンドに渡します。プッシュするイメージ用の レポジトリ を作成してから、そのURLをイメージ名として使います。
export AWS_ACCOUNT_ID="***"
export AWS_REGION="ap-northeast-1"
export REGISTRY_URI="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com"
# 認証
aws ecr get-login-password --region "${AWS_REGION}" | docker login --username AWS --password-stdin "${REGISTRY_URI}"
# レポジトリ作成
aws ecr create-repository --repository-name test-image-1
# ビルド/プッシュ
docker build -t "${REGISTRY_URI}/test-image-1" .
docker push "${REGISTRY_URI}/test-image-1"
Github Container Registry (GHCR)
個人アクセストークン(PAT)を docker login
コマンドに渡して認証します。イメージをプッシュするために、PATに write:packages
のスコープを追加する必要があります。UIからPATを作ると、repo
スコープが勝手に選択されますが、イメージ管理するだけならこの権限は不要なので、このリンクで write:packages
のみ選択した状態にできます。
GCRのイメージ名は ghcr.io/OWNER/IMAGE_NAME[:TAG]
のフォーマットで書きます。
export GCR_PAT="***"
# 認証
echo $GCR_PAT | docker login ghcr.io -u USERNAME --password-stdin
# ビルド/プッシュ
docker build ghcr.io/hankehly/test-image-1 .
docker push ghcr.io/hankehly/test-image-1
これで GitHub アカウントに紐づけた状態でプッシュされ、https://github.com/{username}?tab=packages
で確認できます。さらに、Dockerfile にラベルを追加すれば、特定の GitHub レポジトリに紐付けることができます。
LABEL org.opencontainers.image.source="https://github.com/{owner}/{repo}"
プッシュ後に、レポジトリのメインページの右側にイメージ名が表示されます。
Google Cloud Artifact Registry
gcloud auth configure-docker
コマンドで認証します。また、gcloud auth print-access-token
コマンドで、docker login
コマンドに渡すためのアクセストークンを取得することも可能です。
イメージをプッシュする前に Artifact Registry のレポジトリ を作成する必要があります。イメージ名は LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE
のフォーマットで書きます。
export GCP_REGION="asia-northeast1"
export GCP_PROJECT="***"
export REGISTRY_URI="${GCP_REGION}-docker.pkg.dev"
# 認証(オプション1)
gcloud auth configure-docker "${REGISTRY_URI}"
# 認証(オプション2)
# gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin "${REGISTRY_URI}"
# レポジトリ作成
gcloud artifacts repositories create my-repo --location "${GCP_REGION}" --repository-format docker
# ビルド/プッシュ
export IMAGE_NAME="${REGISTRY_URI}/${GCP_PROJECT}/my-repo/test-image-1"
docker build "${IMAGE_NAME}" .
docker push "${IMAGE_NAME}"
Google Cloud Container Registry (GCR)
コンテナイメージを管理するための推奨サービスが Artifact Registry です。Container Registry のサポートは今後、重要なセキュリティ修正のみ継続されます。
GCR は非推奨化されていますが、まだ使っている方が多いかと思います。Artifact Registry と違って、事前にレポジトリを作成する必要がないところが魅力的です。認証方法は Google Cloud Artifact Registry と同じで、イメージ名は HOSTNAME/PROJECT-ID/IMAGE
のフォーマットで書きます。
export REGISTRY_URI="asia.gcr.io"
export GCP_PROJECT="***"
export IMAGE_NAME="${REGISTRY_URI}/${GCP_PROJECT}/test-image-1"
# 認証(オプション1)
gcloud auth configure-docker
# 認証(オプション2)
# gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin "${REGISTRY_URI}"
# ビルド/プッシュ
docker build "${IMAGE_NAME}" .
docker push "${IMAGE_NAME}"
認証済みレジストリを確認する方法
Docker CLI は、$HOME
ディレクトリ内の .docker
に設定ファイルを保存します。この中の config.json
に、過去認証したことがあるレジストリ情報が入っています。
$ jq < "${HOME}"/.docker/config.json
{
"***.dkr.ecr.us-east-1.amazonaws.com": {},
"asia-northeast1-docker.pkg.dev": {},
"ghcr.io": {},
"https://index.docker.io/v1/": {}
}