Docker HubからECR Public Galleryへ移行する

自己紹介
2025年3月からKTCに入社したtetsuと申します。
前職ではインフラエンジニア(オンプレ・クラウド)をしており、KTCではPlatformエンジニアとしてジョインしました。
旅行と自然が好きで大きな休みのたびにどこか遠出にしています。
概要
本記事では、Github Actionsのワークフローにて、Docker Hubからパブリックコンテナイメージ(JDK, GO, nginxなど)をPullしていた設定を、ECR Public GalleryからPullするように移行する手順や設定を紹介します。
2025年4月1日から、未認証ユーザによるDocker HubのパブリックコンテナイメージPullに対して制限が厳しくなるという話でした。
具体的には、認証されていないユーザによるPullは、ソースIPアドレスあたり10回のPull/時間に制限されることになります。
詳しくはこちら。
Github Actionsのワークフローを実行する仮想マシンは全ユーザが共有されるため、Docker HubからみたソースIPアドレスも限られたものになります。よって上記の制限により、Github Actionsを使ってコンテナのBuildを行うにあたりネックとなるため、対応策を練る必要がありました。
前提構成
弊社では以下のような構成でGithub Actionsを利用し、コンテナのBuildを自動化していました(ざっくり抽象化した構成になります)。
対応策の検討
Pull制限問題への対応策をいくつか検討しました。
Personal Access Token(PAT)を使用してDocker HubにログインしたうえでPull
「そもそもDocker Hubに認証すればいいじゃん」という声が聞こえてきます。
Docker HubのPATを発行して、Github ActionsのワークフローでそのTokenを利用してdocker loginすることで認証できます。
それによりPull制限を回避することができます。
ただし、PATは個人に紐づきます。
弊社ではGithub Actionsをチームで共用して使用するため、個人にTokenが紐づいてしまうと、ライセンス管理の面で好ましくないと考えています。
Organization Access Token(OAT)を使用してDocker HubにログインしたうえでPull
上記の方法と同じになるのですが、異なる点はOATという組織に紐づいた共有Tokenで認証するという点になります。
この共有Tokenを利用するには、Docker DesktopのライセンスをTeamもしくはBusinessにする必要があります。
Github Container Registry(GHCR)へ移行
Githubが提供するGithub Container Registry(GHCR)からコンテナイメージをPullする方法です。
Github Actionsのワークフローで{{ secrets.GITHUB_TOKEN }}を使用して認証することで、コンテナイメージをPullすることができます。
ただし、コンテナイメージの検索をするのが少し癖があり、検索しづらいです(Docker Hubで提供されているバージョンと比較するのが難しい印象です)。
ECR Public Galleryへ移行
AWSが提供するECR Public GalleryからコンテナイメージをPullする方法です。
ECR Public GalleryにIAMを利用して認証するか、認証しないかで制限が異なりますが、基本的には無料で使うことができます。
ECR Public Galleryに未認証ユーザはソースIPアドレスあたり以下のような制限になります。
- 1回/秒のPull
- 500GB/月のPull
一方で認証ユーザについてはアカウント単位で以下のような制限になります。
- 10回/秒のPull
- 5TB/月を超える転送については0.09USD/GB(5TBまでは無料)
以下ドキュメントにて詳細な上限が記載されています。
AWS アカウントを利用していない場合、パブリックリポジトリから転送されるデータはソース IP によって制限されます。
ECR Public GalleryにはDocker公式のコンテナイメージがあり、それがDocker Hubのコンテナイメージと対応しています。
そのため運用上利用しやすく、容易に移行がしやすいです。
案比較
上記の案をまとめてQCD評価しました。
比較表は以下の通りです。
案 | Quality | Cost | Delivery |
---|---|---|---|
PATを使用してDocker Hubにログイン | × - 個人トークンに依存する状態のため組織としては好ましくない - 利便性については現状と変わりなし |
〇 追加費用なし | 〇 対応が工数が少ないためすぐ実装可能 |
OATを使用してDocker Hubにログイン | 〇 現状から変わりなし | × 利用ユーザに応じてライセンス費用が増える | × ライセンス変更にリードタイムがかかる |
GHCRへ移行 | △ Docker Hubで利用しているイメージとの対応が検索しづらい | 〇 追加費用なし | 〇 対応が工数少ないためすぐ実装可能 |
ECR Public Galleryへ移行 | 〇 Docker Hubで利用しているイメージとの対応が検索がしやすい | 〇 追加費用なし | 〇 対応工数が少ないためすぐ実装可能 |
- PATとOATを利用する案は現状から利便性が変わらない点は優位である
- GHCRはGithubの{{ secrets.GITHUB_TOKEN }} を利用することで容易に実装ができるが、ECR Public Galleryと比べてコンテナイメージの検索がしづらい
- ECR Public GalleryはIAMポリシーで設定変更が必要であるが、軽微な修正であるので対応工数はそこまで増えない
上記を踏まえて、弊社では、対応工数が少なく、追加費用がかからない、かつ利便性の高い「ECR Public Galleryへ移行」案を採用することにしました。
※ 各個人・各社によって環境は変わるので、必ずしもこの選択がよいとは限りません。
ECR Public Galleryへ移行するための設定
コンテナイメージの取得元修正、Github Actionsのワークフローを定義するYAMLファイル、AWSでの設定が必要になるためそれらを設定します。
構成図
コンテナイメージの取得元修正
コンテナイメージの検索
Dockerfileやdocker-compose.ymlなどでどこからコンテナイメージをPullするかを指定しているかと思います。今回はDockerfileでJDKのコンテナイメージの取得元をDocker HubからECR Public Galleryに移行するケースで説明します。
以下のようにDockerfileのFROM句があるとします。
FROM eclipse-temurin:17.0.12_7-jdk-alpine
ECR Public Galleryにこのイメージが存在するかをこちらで検索します。
今回だと:の前のDocker Hubの公式コンテナイメージ(今回はeclipse-temurin
)を検索して、by Dockerになっているものを選択します。
「image tags」を選択して、イメージ一覧を表示します。
Docker Hubの公式コンテナイメージのタグ(今回は17.0.12_7-jdk-alpine
)をimage tagsの検索欄に入力し、対象イメージを検索します。そして、「Image URI」をコピーします。
コンテナイメージの取得元修正
FROM句に修正後のコンテナイメージのURIをペーストします。
今回だと、以下のように修正になります(当初のURIと比べてpublic.ecr.aws/docker/library/が追加されています)。
FROM public.ecr.aws/docker/library/eclipse-temurin:17.0.12_7-jdk-alpine
これでECR Public GalleryからコンテナイメージをPullするように設定ができました。
AWSの設定
ECR Public Galleryに認証してログインした状態でPullできるようにするため、IAMロールとIAMポリシーを作成します。
IAMロール
Github公式ドキュメントで手順の案内があるので、こちらを参考にしてください。
IDプロバイダの構築 -> IAMロールの構築の順に対応となります。
IAMポリシー
ECR Public GalleryからPullするためのアクションを許可するIAMポリシーを作成します。
以下ドキュメントを参考にしています。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GetAuthorizationToken",
"Effect": "Allow",
"Action": [
"ecr-public:GetAuthorizationToken",
"sts:GetServiceBearerToken"
],
"Resource": "*"
}
]
}
このIAMポリシーを上記で作成したIAMロールにアタッチをします。
Github ActionsにECR Public Galleryへのログイン処理の追加
ECR Public Galleryに認証した状態でログインするよう、Github Actionsのワークフローを定義するYAMLファイルでログイン処理を追加します。
弊社の環境ですと、Docker Buildのステップの前に以下の記載を追加します。
## ECR Public Galleryへログイン
- name: Login to ECR Public Gallery
id: login-ecr-public
run: |
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
※ ECR Public Galleryがus-east-1リージョンに存在するため、--region us-east-1
で明示的に指定します。
さいごに
Github Actionsのワークフローにて、Docker Hubからパブリックコンテナイメージ(JDK, GO, nginxなど)をPullしていた設定を、ECR Public GalleryからPullするように移行する手順や設定を紹介しました。
この記事が皆様の開発や業務に役立てば幸いです!
関連記事 | Related Posts
We are hiring!
【DBRE】DBRE G/東京・名古屋・大阪
DBREグループについてKINTO テクノロジーズにおける DBRE は横断組織です。自分たちのアウトプットがビジネスに反映されることによって価値提供されます。
【クラウドエンジニア】Cloud Infrastructure G/東京・大阪
KINTO Tech BlogWantedlyストーリーCloud InfrastructureグループについてAWSを主としたクラウドインフラの設計、構築、運用を主に担当しています。