Amazon ECR
ユーザーガイド (API バージョン 2015-09-21)

Amazon ECR 使用時の Docker コマンドのエラーのトラブルシューティング

場合によっては、Amazon ECR に対して Docker コマンドを実行すると、エラーメッセージが表示されることがあります。一般的なエラーメッセージと考えられる解決策を以下に説明します。

Amazon ECR レポジトリからイメージをプルするときのエラー: "ファイルシステムの検証に失敗しました" または "404: イメージが見つかりません"

docker pull コマンドを使用すると、Docker 1.9 以降で Amazon ECR レポジトリからイメージをプルするときはエラー Filesystem verification failed が表示されます。Docker 1.9 より前のバージョンを使用するときはエラー 404: Image not found が表示される場合があります。

考えられる理由とその説明を以下に示します。

ローカルディスクがいっぱいである

docker pull を実行しているローカルディスクがいっぱいである場合、ローカルファイルで計算された SHA-1 ハッシュは、Amazon ECR で計算されたものとは異なる可能性があります。ローカルディスクに、プルしている Docker イメージを保存するのに十分な空き容量があることを確認します。新しいイメージの容量を確保するために、古いイメージを削除することもできます。docker images コマンドを使用して、ローカルにダウンロードしたすべての Docker イメージのリストとそのサイズを表示します。

ネットワークエラーにより、クライアントがリモートリポジトリに接続できない

Amazon ECR レポジトリへの呼び出しでは、インターネットへの機能している接続が必要です。ネットワーク設定を確認し、他のツールやアプリケーションがインターネット上のリソースにアクセスできることを確認します。プライベートサブネットの Amazon EC2 インスタンスで docker pull を実行している場合は、そのサブネットにインターネットへのルートがあることを確認します。ネットワークアドレス変換 (NAT) サーバーまたはマネージド NAT ゲートウェイを使用します。

現時点では、Amazon ECR リポジトリへの呼び出しでは、会社のファイアウォールから Amazon Simple Storage Service (Amazon S3) へのネットワークアクセスも必要です。組織で、サービスエンドポイントを許可するファイアウォールソフトウェアまたは NAT デバイスを使用している場合、現在のリージョンの Amazon S3 サービスエンドポイントが許可されていることを確認します。

HTTP プロキシの背後で Docker を使用している場合は、適切なプロキシ設定を使用して Docker を設定できます。詳細については、Docker ドキュメントの「HTTP プロキシ」を参照してください。

エラー: Amazon ECR からイメージをプルする際の、"ファイルシステムレイヤーの検証に失敗しました"

docker pull コマンドを使用してイメージをプルするときに、エラー image image-name not found が表示される場合があります。Docker のログを調べると、次のようなエラーが見つかる場合があります。

filesystem layer verification failed for digest sha256:2b96f...

このエラーは、イメージの 1 つ以上のレイヤーがダウンロードに失敗したことを示します。考えられる理由とその説明を以下に示します。

古いバージョンの Docker 使用している

このエラーは、Docker 1.10 より前のバージョンを使用している場合に、まれに発生することがあります。Docker クライアントを 1.10 以降にアップグレードします。

クライアントでネットワークエラーまたはディスクエラーが発生した

Filesystem verification failed メッセージについて前に説明したように、ディスクがいっぱいであるか、ネットワークの問題により、1 つ以上のレイヤーをダウンロードできない可能性があります。上記の推奨事項に従って、ファイルシステムがいっぱいでないこと、およびネットワーク内から Amazon S3 へのアクセスを有効にしたことを確認します。

レポジトリへのプッシュの際に、HTTP 403 エラー、または "基本的な認証情報がありません" というエラーが表示される

aws ecr get-login コマンドを使用して Docker に対して正常に認証された場合であっても、HTTP 403 (禁止) エラーが発生したり、docker push コマンドからエラーメッセージ no basic auth credentials を受け取る場合があります。この問題の既知の原因をいくつか次に示します。

別のリージョンに対して認証されている

認証リクエストは特定のリージョンに関連付けられていて、リージョン間では使用できません。たとえば、米国西部 (オレゴン) から認証トークンを取得する場合、これを使用して、米国東部(バージニア北部) のリポジトリに対して認証を行うことはできません。この問題を解決するには、認証と docker push コマンド呼び出しの両方に対して同じリージョンを使用していることを確認します。

間違った AWS アカウントのリポジトリへのプッシュを認証しています

ある AWS アカウントの IAM ユーザーを使用しているが、別のアカウントによってホストされているリポジトリにプッシュする場合、aws ecr get-login を呼び出すときに --registry-ids パラメータを明示的に指定する必要があります。これを行わない場合、デフォルトで取得される Docker ログインコマンドは、IAM ユーザーをホストする同じアカウントのリポジトリへのプッシュのみを許可します。リポジトリをホストするアカウントにプッシュする権限はありません。aws ecr get-login からのレスポンスのリポジトリ URL が、プッシュ先のリポジトリ URL (URL のアカウント ID 部分を含む) と一致することを常に確認してください。

トークンの有効期限が切れた。

GetAuthorizationToken オペレーションを使用して取得したトークンのデフォルトのトークン有効期限は 12 時間です。ただし、一時的なセキュリティ認証情報メカニズムを使用して認証を行ってトークンを受け取る場合、トークンの有効期間は、一時的なセキュリティ認証情報の長さと同じです。一時的なセキュリティ認証情報のメカニズムには、多要素認証 (MFA) や AWS Security Token Service があります。たとえば、ロールを引き受けて aws ecr get-login コマンドを呼び出す場合、認証トークンは 15 分~1 時間で有効期限が切れます。これは、aws sts assume-role コマンドを呼び出すときに使用する設定によって異なります。

wincred 認証情報マネージャーのバグ

一部のバージョンの Docker for Windows では、wincred という認証情報マネージャーを使用します。この認証情報マネージャーは、aws ecr get-login によって生成された Docker ログインコマンドを正しく処理しません (詳細については、https://github.com/docker/docker/issues/22910 を参照)。出力される Docker ログインコマンドは実行できますが、イメージをプッシュまたはプルしようとすると、コマンドは失敗します。これに対処するには、aws ecr get-login から出力される Docker ログインコマンドのレジストリ引数から https:// スキームを削除します。HTTPS スキームのない Docker ログインコマンドの例を次に示します。

docker login -u AWS -p <password> <aws_account_id>.dkr.ecr.<region>.amazonaws.com