エラーの概要

Docker Compose の 404 エラーは、docker-compose.yml(または compose.yml)で指定されたイメージ、サービス、ボリューム、またはネットワークがシステムに見つからないときに発生します。このエラーは、イメージのプル失敗、ビルドコンテキストの誤設定、または依存リソースの不足が原因となることがほとんどです。Docker Compose がコンテナーの起動や構築を試みた際に、参照先が存在しないことを検出すると、このエラーを出力して処理を中断します。

実際のエラーメッセージ例

Error response from daemon: pull access denied for <your-image-name>, repository does not exist or may require 'docker login'

または、より明確な 404 表現として:

{
  "message": "manifest not found",
  "status": 404
}

ローカルでのビルド失敗時:

ERROR: Service '<your-service-name>' failed to build : [Errno 2] No such file or directory: '<your-build-context-path>'

よくある原因と解決手順

原因1:compose.yml 内で指定したイメージが存在しない、またはタグが間違っている

Docker Compose がレジストリ(Docker Hub やプライベートレジストリー)からイメージをプルしようとしても、そのイメージが存在しない、あるいはタグが誤っていると 404 エラーが発生します。たとえば、タイポやバージョン番号の誤指定があると、プル対象が見つからなくなります。

Before(エラーが起きるコード):

version: '3.8'
services:
  web:
    image: nginx:lattest  # タイポ: lattest → latest
    ports:
      - "80:80"

After(修正後):

version: '3.8'
services:
  web:
    image: nginx:latest  # 正しいタグ名に修正
    ports:
      - "80:80"

原因2:build コンテキストのパスが存在しない、または間違っている

build キーでコンテキストパスを指定する際、相対パスが誤っていたり、ディレクトリが削除されていたりすると、Docker Compose はイメージをビルドできず 404 エラーを出力します。

Before(エラーが起きるコード):

version: '3.8'
services:
  app:
    build:
      context: ./srcs  # このパスが実際には存在しない
      dockerfile: Dockerfile
    ports:
      - "3000:3000"

After(修正後):

version: '3.8'
services:
  app:
    build:
      context: ./src  # 実際に存在するパスに修正
      dockerfile: Dockerfile
    ports:
      - "3000:3000"

原因3:依存するボリューム、ネットワーク、サービスがあらかじめ作成されていない

compose ファイルで外部ボリューム(external: true)または外部ネットワークを参照しているが、それらが Docker ホスト上に先に作成されていない場合、サービス起動時に 404 エラーが発生します。

Before(エラーが起きるコード):

version: '3.8'
services:
  db:
    image: postgres:13
    volumes:
      - shared_data:/var/lib/postgresql/data
volumes:
  shared_data:
    external: true  # 外部ボリュームを参照

After(修正後):

version: '3.8'
services:
  db:
    image: postgres:13
    volumes:
      - shared_data:/var/lib/postgresql/data
volumes:
  shared_data:
    external: false  # ローカルで自動作成、またはあらかじめ作成済み

あるいは事前に以下のコマンドでボリュームを作成します:

docker volume create shared_data

ツール固有の注意点

Docker Compose 環境では、イメージのプル時にレジストリー認証が必要な場合があります。プライベートレジストリーからイメージをプルする際は、docker login でレジストリーに認証してから docker compose up を実行してください。また、compose ファイルの image フィールドに完全修飾イメージ名(FQDN 形式)を指定する必要があります。

さらに、docker compose build でローカルイメージをビルドする場合は、Dockerfile が context で指定されたディレクトリ内に存在することを確認してください。Dockerfile が見つからない場合、Docker Compose は 404 相当のエラーを出力します。複数のサービスが存在する場合、各サービスの build.context パスを個別にチェックすることも重要です。

環境変数を .env ファイルで注入している場合、そのファイルが compose ファイルと同じディレクトリに存在し、変数の評価が正しく行われているか確認することも忘れずに。

それでも解決しない場合

以下の手順で詳細を確認してください。

ローカルイメージの確認:

docker images

このコマンドで、使用しようとしているイメージがローカルに存在するかどうかをリスト表示します。存在しない場合は、イメージ名またはタグを修正するか、docker compose up --build で再度ビルドしてください。

ビルドコンテキストのパス確認:

ls -la <your-build-context-path>

compose.yml で指定したパスが実際に存在し、Dockerfile が含まれているか確認します。

詳細なビルドログの確認:

docker compose up --build --verbose

--verbose フラグを付けることで、より詳細なビルドログが表示され、エラーの正確な位置を特定しやすくなります。

レジストリー認証の確認(プライベートレジストリーの場合):

docker login <your-registry-url>
docker compose pull

プライベートレジストリーを使用している場合は、事前にログインしてからプルを試みてください。

詳細は Docker Compose 公式ドキュメント および Docker イメージガイド を参照してください。


免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。