KAKEHASHI Tech Blog

カケハシのEngineer Teamによるブログです。

Amazon ECR Docker Credential Helperを利用したECR認証

docker loginによるコンテナレジストリログインの課題

Docker Clientから各種コンテナレジストリに認証するときは、通常docker loginコマンドを利用します。しかし、以下の課題があります。この記事ではこの課題に対応するDocker Credential Helperを紹介します。

  1. ログインコマンドが複雑
  2. 認証トークンがローカルに保存される

一つ目はわかりやすいポイントです。例えばECRなら、以下のようにAWS CLIでDocker Client用の認証トークンを発行してログインしますが、見ての通りパラメータも長く、複雑です。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin XXXXX.dkr.ecr.ap-northeast-1.amazonaws.com

一方後者は内部的なので、通常使う分には気づきづらいポイントです。aws ecr get-login-passwordコマンドで発行されたトークンをdocker loginコマンドで受け取ります。このトークンは下記のように~/.docker/config.jsonに記述されます。しかし、認証トークンは以下のように平文で記載されます(authsの部分)。

ECRの認証トークン長は非常に長く、流出リスクは比較的低いと考えられます。とはいえ、12時間利用できるトークンを平文で保存しておくのはセキュリティ上避けたいです。

{
    "auths": {
        "111111111111.dkr.ecr.region.amazonaws.com": {
            "auth": "SOME_VERY_LONG_TOKEN_ABCDE12345"
        }
    },
    "currentContext": "colima",
    "cliPluginsExtraDirs": [
        "/opt/homebrew/lib/docker/cli-plugins"
    ],
    "aliases": {
        "builder": "buildx"
    }
}

Docker Credential Helper

Docker Credential Helperは各コンテナレジストリの認証時に自動的に認証情報を取得してくれる機能で、これを有効化しておくと認証情報が保存されず、毎回使い捨てになります。

Helperはコンテナレジストリごとに提供されますが、ここではECRを例にとって説明していきます。 ECRの場合はAWS公式でAmazon ECR Credential Helperが提供されています。

macOSの場合は以下のHomebrewコマンドでインストールできます。

brew install docker-credential-helper-ecr

GitHub Actionsのubuntuイメージには標準でECR Credential Helperが入っているので、ECRの場合は~/.docker/config.jsonを編集するだけで動きます。

Credential Helperの設定方法

~/.docker/config.jsonファイルの"credHelpers"でレジストリごとのHelperコマンドを指定することで利用できます。

"credHelpers": {
        "レジストリ名": "helperの名前"
}

Credential Helperのコマンド名は"docker-credential-"プレフィックスが必要で、設定ファイルではその後の部分だけ指定します。例えばECRの場合は"docker-credential-ecr-login"というコマンド名なので、"ecr-login"を指定します。

ECR Public

ECR Public Registryを使いたい場合、credHelpersは以下のような設定になります。ECR PublicはIPv4/v6デュアルスタックエンドポイントが提供されています。デュアルスタックエンドポイントはecr-public.aws.comですが、2025/09/22時点でECR Credential Helperはデュアルスタックエンドポイントに対応していません(Issue作成済み)。そのため、ecr-public.aws.comをレジストリとして指定した場合、認証されずに利用するのでご注意ください。 https://docs.aws.amazon.com/AmazonECR/latest/public/public-ecr-requests.html#public-ipv6-access-getting-started

"credHelpers": {
        "public.ecr.aws": "ecr-login"
}

ECR Private

ECR Private Registryの場合は以下のようになります。<アカウントID>.dkr-ecr.<リージョン>.on.awsはPrivate RegistryのIPv4/IPv6デュアルスタックエンドポイントです。ECR Publicと異なり、Private Registryはデュアルスタックエンドポイントにも対応しています。

"credHelpers": {
        "<アカウントID>.dkr.ecr.<リージョン>.amazonaws.com": "ecr-login",
        "<アカウントID>.dkr-ecr.<リージョン>.on.aws": "ecr-login"
}

GitHub Actions環境での設定

GitHub ActionsのUbuntu runnerでは~/.docker/config.jsonはこのようになっています。Docker Hubの認証情報がすでに埋め込まれているので、これに追記する形で設定していきます。

{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "DOCKER_HUB_TOKEN"
        }
    }
}

jqを使ってconfig.jsonへの追記

既存項目を破壊せずにcredHelpersを追記するためにjqコマンドを利用します。GitHub Actions環境では同梱されているので、追加インストールは不要です。例えば111111111111.dkr.ecr.ap-northeast-1.amazonaws.comに設定するなら、次のjqコマンドで追加できます。 Dockerクライアントで利用する設定ファイルなので、編集後にDocker Engineの再起動は不要です。

jq --arg key "111111111111.dkr.ecr.ap-northeast-1.amazonaws.com" --arg value "ecr-login" '.credHelpers |= {($key): $value}' ~/.docker/config.json > /tmp/config.json
mv /tmp/config.json ~/.docker/config.json

このコマンドでcredHelpdersオブジェクトにリポジトリ名とヘルパープログラムをキーバリュー形式で追加しています。

ECR Public/PrivateのIPv4エンドポイントとECR Privateのデュアルスタックエンドポイントを登録する場合はこのようになります。

jq \
  --arg key1 "111111111111.dkr.ecr.ap-northeast-1.amazonaws.com" \
  --arg key2 "111111111111.dkr-ecr.ap-northeast-1.on.aws" \
  --arg key3 "public.ecr.aws" \
  --arg value "ecr-login" \
  '.credHelpers |= (. + {($key1): $value, ($key2): $value, ($key3): $value})' \
  ~/.docker/config.json > /tmp/config.json
mv /tmp/config.json ~/.docker/config.json

GitHub Actions環境でこのコマンドを実行すると、~/.docker/config.jsonはこのようになります。

{
  "auths": {
    "https://index.docker.io/v1/": {
      "auth": "SOME_DOCKER_HUB_TOKEN"
    }
  },
  "credHelpers": {
    "111111111111.dkr.ecr.ap-northeast-1.amazonaws.com": "ecr-login",
    "111111111111.dkr-ecr.ap-northeast-1.on.aws": "ecr-login",
    "public.ecr.aws": "ecr-login"
}

使い方

Credential Helperを使う場合、事前のdocker loginは不要です。docker loginを実行した場合でも保存された認証情報は使われません。その代わりdocker pullなどコマンドを実行するたびにAWS認証が必要です。GitHub Actionsならaws-actions/configure-aws-credentialsワークフローなどを使って事前にログインしておきます。

GitHub Actionsだとこのような設定になります。例示のためアカウントIDなどをそのまま記載していますが、実際に使う場合はActions Secretの利用を推奨します。

GitHub Actionsワークフロー例

name: ECR Credential Helper
on:
  workflow_dispatch:
jobs:
  build:
    name: ECR Login
    runs-on: ubuntu-24.04
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v5
        with:
          role-to-assume: arn:aws:iam::111111111111:role/gh-action-role
          aws-region: ap-northeast-1

      - name: set credential helper
        id: docker-config
        run: |
          tmp_config=$(mktemp)
          jq \
            --arg key1 "111111111111.dkr.ecr.ap-northeast-1.amazonaws.com" \
            --arg key2 "111111111111.dkr-ecr.ap-northeast-1.on.aws" \
            --arg key3 "public.ecr.aws" \
            --arg value "ecr-login" \
            '.credHelpers |= (. + {($key1): $value, ($key2): $value, ($key3): $value})' \
            ~/.docker/config.json > $tmp_config
          mv $tmp_config ~/.docker/config.json

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Build Docker images
        uses: docker/build-push-action@v6
        with:
          context: .
          file: ./Dockerfile
          tags: 111111111111.dkr-ecr.ap-northeast-1.on.aws/repo:latest
          push: true

ECR以外のCredential Helper

この記事ではECR Credential Helperを使いましたが、他のクラウドプロバイダーのCredential Helperもあります。

Google Cloud GCR

GCRはgcloudコマンドを利用してconfig.jsonファイルに設定します。GitHub Actions環境にはgcloudコマンドも導入されていますので、追加インストール不要です。 https://cloud.google.com/sdk/gcloud/reference/auth/configure-docker

Azure ACR

ACRもCredential Helperが提供されていますが、残念ながらすでにDeprecated扱いになっています。 https://github.com/Azure/acr-docker-credential-helper

担当:松浦