はじめに
Docker v29以降では、DockerイメージをAWS ECRへpushする際に、以下のエラーとなりイメージをpushできなくなった。エラーの対処方法についてまとめる。
unknown: unexpected status from HEAD request to https://{aws_account_id}.dkr.ecr.{region}.amazonaws.com/{ecr_image_name}: 403 Forbidden
動作確認環境
- Ubuntu 24.04 x86_64
- Docker version 29.2.1, build a5c7197
前提条件
- AWS ECRへのアクセス権があり、AWS ECRにログイン済み
以下のようになればOK。AWS ECRにログインするコマンド例
aws ecr get-login-password --region ap-northeast-1 --profile default | docker login --username AWS --password-stdin {aws_account_id}.dkr.ecr.ap-northeast-1.amazonaws.comLogin Succeeded
原因
Docker Engine v29 では image store の実装として containerd image store が
デフォルトで有効化された。
これにより、docker build で作成されたイメージの保存方式が
従来の classic image store から containerd image store に変更された。
従来の Docker(v28 以前)では、docker push 時に Docker Image Manifest V2 形式の manifest が送信されていた。
しかし containerd image store を使用する場合、buildx や OCI 形式の image index(manifest list)を含む manifest が生成されることがある。
Docker push では、レイヤーの存在確認のためにレジストリへ HEAD リクエストが送信される。
この manifest list / image index を含む push 処理において、AWS ECR との互換性の問題により HEAD リクエストが 403 Forbidden となる場合がある。
詳細は、こちらの記事を参照。
方法
以下の2つの方法で対処できる。
-
containerd-snapshotterオプションを変更する(推奨) - v28系統にダウングレードする
containerd-snapshotterオプションを変更する
containerd image store を無効化して、従来の classic image store を使用する。
Dockerの設定ファイル(/etc/docker/daemon.json)を編集する。
sudo vi /etc/docker/daemon.json
以下を追記する。
既存の設定がある場合は JSON の形式を崩さないように追記する。
{
"features": {
"containerd-snapshotter": false
}
}
Dockerを再起動する。
sudo systemctl restart docker
ECRにDockerイメージをpushできるようになったか確認する。
v28系統にダウングレードする
※ Docker のダウングレードはセキュリティ更新を受けられなくなる可能性があるため、
containerd-snapshotterオプションを変更する方法で解決できない場合のみ実施することを推奨する。
利用可能なバージョンを確認して、v28系統を探す。
apt list --all-versions docker-ce
以下のバージョンが該当する。
docker-ce/noble 5:28.5.2-1~ubuntu.24.04~noble
上記バージョンを指定して、インストールする(インストール方法の詳細は公式ドキュメントを参照)。
VERSION_STRING=5:28.5.2-1~ubuntu.24.04~noble
sudo apt install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
アップグレードしないようにバージョンを固定する。
sudo apt-mark hold docker-ce
sudo apt-mark hold docker-ce-cli
Dockerを再起動する。
sudo systemctl restart docker
インストールが完了したら、Dockerのバージョンを確認する。
docker version
以下が表示されればOK。
Client: Docker Engine - Community
Version: 28.5.2
API version: 1.51
Go version: go1.25.3
Git commit: ecc6942
Built: Wed Nov 5 14:43:10 2025
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 28.5.2
API version: 1.51 (minimum version 1.24)
Go version: go1.25.3
Git commit: 89c5e8f
Built: Wed Nov 5 14:43:10 2025
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v2.2.1
GitCommit: dea7da592f5d1d2b7755e3a161be07f43fad8f75
runc:
Version: 1.3.4
GitCommit: v1.3.4-0-gd6d73eb8
docker-init:
Version: 0.19.0
GitCommit: de40ad0
ECRにDockerイメージをpushできるようになったか確認する。
まとめ
Docker v29 以降では containerd image store がデフォルトで有効化された影響で、
AWS ECR への push 時に 403 Forbidden エラーが発生する場合がある。
その場合は以下のいずれかの方法で対処できる。
- containerd-snapshotter を無効化する
- Docker を v28 系へダウングレードする
参考