Skip to content

docker-compose.ymlのversionフィールド

<WARNING> **重要な最新情報 (2024年時点)** Docker公式ドキュメントで明示され、現代的なCompose環境では`version`の指定が**不要かつ非推奨**です。ファイルに記載すると警告が表示されます: ```bash WARNING: The top level 'version' key is obsolete and ignored. ``` </WARNING>

問題の本質

docker-compose.ymlの先頭行にあるversion: '3.9'のような記述は、コマンドdocker-compose --versionで確認されるツール自体のバージョン(例:v2.17.2)とは全く別の概念を示しています。多くのユーザーがこの不一致に混乱します。

混乱の具体例

bash
docker compose --version
# 出力: Docker Compose version v2.17.2
yaml
version: '3.9' # コマンド出力と値が異なる!
services:
  web:
    image: nginx

解決策:versionフィールドの正しい理解

核心的な解釈

  1. versionフィールドはComposeファイルのスキーマバージョンを示す
  2. Docker Composeツールの実行バージョンとは無関係
  3. 現在の推奨はこの行を完全に削除する

歴史的背景

Composeの進化に伴い異なるバージョン体系が存在しました:

ファイルバージョンversion:特徴対応Composeツール
1(未指定)Dockerネットワーク未対応Python Composeのみ
222.4単一ホスト向け機能両対応
333.8Docker Swarm対応両対応
Compose仕様不要 (非推奨)モダンCompose機能プラグイン版のみ
<TIP> **バージョン2.4/3.8が境界線** 2023年までは互換性のため`version: '3.8'`推奨されましたが、現在は推奨されません。 </TIP>

現在のベストプラクティス

  1. versionフィールドを削除
    最新のDocker Compose(v2以降)では記載は冗長です

    diff
    - version: '3.9'
    services:
      app:
        image: my-app:latest
  2. 旧環境との互換性が必要な場合の対処法
    レガシープロジェクトでは最小限の値を指定:

    yaml
    version: '3.8' # 最大互換性バージョン
  3. 使用ツールの確認
    あなたのCompose実装を判別:

    bash
    # ハイフン有り → 旧Python版 (非推奨)
    docker-compose --version
    
    # スペース区切り → モダンなプラグイン版
    docker compose --version

技術的な詳細解説

なぜversion指定が紛らわしいのか

  • かつて存在したdocker-compose(Python実装)はバージョン値で挙動を変更
  • 現在主流のdocker compose(Goプラグイン)は値を無視する互換モード
  • 公式が「Compose仕様」に統一したためversion分岐が無意味化

バージョンの役割終了理由

  1. 機能ロック回避
    ファイルのversionで古い挙動に縛られる問題を解消
  2. 仕様と実装の分離
    Composeファイルの解釈規則を独立して進化可能に
  3. 警告メッセージの目的
    ⚠️ ユーザーに不要な記述を気付かせるための設計
<CAUTION> **永続的互換性では無い** `version: '3.8'`のような旧フォーマット指定は、Composeによって将来のバージョンでサポートが廃止される可能性があります。 </CAUTION>

実用的アドバイス

  1. 新規プロジェクト
    versionフィールドそのものを書かないことを推奨
  2. 既存プロジェクトの更新
    機能に影響がなければversion行を安全に削除可能
  3. 警告が出力される場合
    コンテナ動作に問題がなければ無視してOK