CannotPullContainer task errors - Amazon Elastic Container Service

CannotPullContainer task errors

次のエラーは、タスクの作成時に指定されたコンテナイメージが取得できないことを示します。

接続タイムアウト

Fargate タスクが起動すると、その Elastic Network Interface はコンテナイメージを取得するためにインターネットへのルートを必要とします。タスクを起動する際に次のようなエラーが発生した場合は、インターネットへのルートが存在していないことが原因です。

CannotPullContainerError: API error (500): Get https://111122223333.dkr.ecr.us-east-1.amazonaws.com/v2/: net/http: request canceled while waiting for connection"

この問題を解決するには、以下ができます。

  • パブリックサブネットのタスクでは、タスクの起動時に [Auto-assign public IP] (自動割り当てパブリック IP)を [ENABLED] (有効)に指定する必要があります。詳細については、「[Run a standalone task] (スタンドアロンタスクを実行)」を参照してください。

  • プライベートサブネットのタスクでは、タスク起動時に [Auto-assign public IP] (自動割り当てパブリック IP) を [DISABLED] (無効) に指定し、VPC の NAT ゲートウェイを設定してリクエストをインターネットにルートします。詳細については、Amazon VPC ユーザーガイドNAT ゲートウェイ を参照してください。

コンテキストがキャンセルされました

このエラーの一般的な原因は、タスクが使用している VPC にコンテナイメージを Amazon ECR から取得するルートがないためです。

イメージが見つかりません

コンテナの定義で Amazon ECR イメージを指定する場合、ECR リポジトリの完全 URI を、そのリポジトリのイメージ名とともに使用する必要があります。リポジトリまたはイメージが見つからない場合、以下のエラーが表示されます。

CannotPullContainerError: API error (404): repository 111122223333.dkr.ecr.us-east-1.amazonaws.com/<repo>/<image> not found

この問題を解決するには、リポジトリ URI とイメージ名を確認します。また、タスク実行 IAM ロールを使用して適切なアクセスがセットアップされていることを確認します。タスクの実行ロールの詳細については、「Amazon ECS タスク実行IAM ロール」を参照してください。

ディスク容量の不足

コンテナイメージのプル時にコンテナインスタンスのルートボリュームにディスク容量が不足している場合、次のようなエラーが表示されます。

CannotPullContainerError: write /var/lib/docker/tmp/GetImageBlob111111111: no space left on device

この問題を解決するには、ディスク容量を解放します。

Amazon ECS 最適化 AMI を使用している場合は、次のコマンドを使用してファイルシステムで 20 個の最大ファイルを取得できます。

du -Sh / | sort -rh | head -20

出力例:

5.7G    /var/lib/docker/containers/50501b5f4cbf90b406e0ca60bf4e6d4ec8f773a6c1d2b451ed8e0195418ad0d2
1.2G    /var/log/ecs
594M    /var/lib/docker/devicemapper/mnt/c8e3010e36ce4c089bf286a623699f5233097ca126ebd5a700af023a5127633d/rootfs/data/logs
...

場合によっては、前述の例と同様、実行中のコンテナによってルートボリュームが入力される可能性があります。コンテナが max-size 制限のないデフォルトの json-file ログドライバーを使用している場合、ログファイルが使用されているスペースの大半を占めている可能性があります。docker ps コマンドを使用して、上記の出力からコンテナ ID にディレクトリ名をマッピングすることによって、どのコンテナが容量を使用しているかを確認します。例:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 50501b5f4cbf amazon/amazon-ecs-agent:latest "/agent" 4 days ago Up 4 days ecs-agent

デフォルトでは、json-file ログドライバーを使用する場合、Docker はすべてのコンテナの標準出力 (および標準エラー) をキャプチャし、JSON 形式を使用してファイルに書き込みます。ログドライバーオプションとして max-size を設定できます。これにより、ログファイルの容量が大きくなりすぎるのを防ぐことができます。詳細については、Docker ドキュメントの「ロギングドライバーの設定」を参照してください。

このオプションの使用方法を示すコンテナ定義のスニペットを次に示します。

{ "log-driver": "json-file", "log-opts": { "max-size": "256m" } }

コンテナログのディスク容量が大きすぎる場合、awslogs ログドライバーを使用することもできます。awslogs ログドライバーがログを CloudWatch に送信します。これによりコンテナインスタンスのコンテナログに使用されるディスク容量が解放されます。詳細については、「awslogs ログドライバーを使用する」を参照してください。

Docker Hub のレート制限

次のエラーのいずれかが表示された場合は、Docker Hub のレート制限に達している可能性があります。

ERROR: toomanyrequests: Too Many Requests.
You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limits.

Docker Hub のレート制限の詳細については、[Understanding Docker Hub rate limiting] (Docker ハブのレート制限を理解する) を参照してください。

Docker Hub のレート制限を上げ、コンテナインスタンスの Docker プルを認証する必要がある場合は、Amazon Elastic コンテナサービス デベロッパーガイドコンテナインスタンスのプライベートレジストリの認証を参照してください。

イメージのコピーに失敗しました

タスクを起動する際に次のようなエラーが発生した場合は、イメージへのアクセスが存在しないことが原因です。

CannotPullContainerError: ref pull has been retried 1 time(s): failed to copy: httpReaderSeeker: failed open: unexpected status code

この問題を解決するには、以下ができます。

停止エラーの詳細については、「Amazon 伸縮性コンテナサービスユーザーガイドAWS Fargate」の「停止したタスクのエラーコード」を参照してください。