Amazon Elastic Container Service
開発者ガイド (API バージョン 2014-11-13)

コンテナイメージをプルできないエラー

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

接続タイムアウト

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 (有効)] に指定する必要があります。詳細については、「タスクの実行」を参照してください。

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

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

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

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

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

ディスク容量の不足

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

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

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

Amazon ECS-optimized 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 ログドライバーを使用する」を参照してください。