0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker v29でAWS ECRにイメージをpushできないときの対処方法

0
Posted at

はじめに

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にログイン済み
    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.com
    
    以下のようになればOK。
    Login 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 系へダウングレードする

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?