Docker Composeで400エラーが発生する場合、compose.ymlの設定に問題があるか、コマンドのオプション指定が誤っている可能性があります。設定ファイルの検証とコマンドの確認により、ほぼすべてのケースで解決します。
よくある原因
compose.ymlのYAML書式エラー
YAML形式の構文ミスが最も多い原因です。インデント(スペース)の不一致、タブ文字の混在、コロンの後の空白忘れなどが該当します。YAMLはインデントに非常に敏感であり、2文字か4文字のスペースで統一する必要があります。タブ文字を使用するとパーサーが正しく解釈できず、400エラーが発生します。
サービス定義の必須キー不足または型エラー
serviceセクション内で必須キーが欠けている、または値の型が仕様と異なる場合も400エラーになります。例えば、portsに文字列を指定すべきところに数値を指定したり、environmentに配列ではなくオブジェクト形式を使用したりすると、Docker Composeは設定を受け入れません。
docker composeコマンドのオプション指定誤り
docker compose up --detachなど、存在しないオプションを指定した場合や、オプションの値の形式が間違っている場合も400エラーが返されます。オプション名のスペル間違いや、廃止されたオプションの使用もこれに該当します。
解決手順
ステップ1:docker compose configで設定を検証する
まず、compose.ymlが正しく解析されているか確認します。以下のコマンドを実行してください。
docker compose config
このコマンドはDocker Composeが解析した設定をそのまま出力します。エラーがあれば、その時点で具体的なエラーメッセージが表示されます。メッセージに行番号が含まれている場合は、その箇所を重点的に確認してください。
ステップ2:compose.ymlのYAML構文をチェックする
インデント、コロン、引用符などの構文を確認します。以下の点に注意してください。
# 正しい例
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
environment:
- NGINX_HOST=example.com
- NGINX_PORT=80
db:
image: mysql:8.0
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
volumes:
db_data:
# 間違った例
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80" # インデント不足
environment:
NGINX_HOST: example.com # キーと値の関係が不明確
YAMLリンターツール(例:yamllint)をローカルにインストールして検査することも有効です。
# yamllintのインストール(Pythonが必要)
pip install yamllint
# compose.ymlを検査
yamllint compose.yml
ステップ3:サービス定義の型を確認する
各サービスの主要キーの値の型が正しいか確認します。portsとvolumesは配列形式が必須です。
# ポートの正しい指定例
ports:
- "8080:80" # 文字列
- target: 80 # オブジェクト形式
published: 8080
protocol: tcp
# ボリュームの正しい指定例
volumes:
- /host/path:/container/path
- named_volume:/container/path
# 環境変数の正しい指定例(配列とオブジェクトの両形式で可)
environment:
- KEY1=value1
- KEY2=value2
# または
environment:
KEY1: value1
KEY2: value2
ステップ4:docker composeコマンドのオプションを確認する
使用しているコマンドが正しいか確認します。
# ヘルプを表示
docker compose --help
# サブコマンド別のヘルプ(例:up)
docker compose up --help
正しいコマンド例を以下に示します。
# コンテナーをバックグラウンドで起動
docker compose up -d
# 特定のcompose.ymlファイルを指定
docker compose -f ./custom-compose.yml up -d
# サービスをビルドしてから起動
docker compose up --build
# コンテナーを停止・削除
docker compose down
# ログを表示
docker compose logs -f
ステップ5:特定のファイルパスを確認する
複数のcompose.ymlが存在する場合、正しいファイルを指定しているか確認します。
# デフォルトのcompose.ymlを使用
docker compose up -d
# ファイル名またはパスを明示的に指定
docker compose -f /path/to/compose.yml up -d
# 複数のcomposeファイルをマージ
docker compose -f compose.yml -f compose.override.yml up -d
それでも解決しない場合
docker compose config --resolve-image-digestsを実行して、詳細な検証情報を確認してください。ネットワーク接続の問題でレジストリー(イメージ保管サーバー)と通信できていない場合も400エラーが返されることがあります。その場合は、Dockerログ(journalctl -u docker)を確認し、ネットワーク設定を見直してください。
また、Docker Composeのバージョンが古い場合、新しい設定キーが認識されないため、docker compose versionで確認し、必要に応じてアップグレードします。
免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。