昨天 PO 文後,承蒙讀者吳尚齊留言提醒,這才發現我又落伍了!

docker-compose 指令 (Docker Composer V1) 已在 2023/6/30 過時(Deprecated)不再支援 並從新版 Docker Desktop 移除,建議改用 Docker Composer V2 (內建於 docker CLI),升級方式也很簡單,把 docker-compose 改成 docker compose 即可無痛進化。

算算 Lag 兩年有餘,但相比我過去的前科,這次算是很快就跟上惹,噗~

其實我之前就有發現一些異樣,一是按著官方說明在 Debian 裝好 Docker Engine,發現沒 docker-compose 可用要另外 apt install docker-composer 才有。二則是照著 syslog-ng 官方給的 docker-compose.yaml 範例 在我的 CentOS 跑 docker-compose up 出現 ERROR: The Compose file './docker-compose.yml' is invalid because: Unsupported config option for services ... 錯誤,待手動在第一行補上 version: "3" 才 OK。

這下子,先前的兩個謎團都有了合理解釋。新學到舊消息,一如往例進行重點整理:(參考:Migrate from Docker Compose v1 to v2)

  1. 我用了七八年的 docker-compose 是 Docker Compose 的早期獨立版本工具,最初是用 Python 開發,作為 Docker 的擴展工具。它的命令格式是使用中間有連字號的指令,例如 docker-compose up。
  2. Docker Compose V2 從 2020 開始以內建套件形式 (docker-compose-plugin) 整合到 docker CLI,改用 Go 語言開發,效能更好也陸續加入新功能及改麼。V2 呼叫指令改為 docker compose,透過 docker CLI 執行 compose 套件。
  3. V2 可共用 V1 的 docker-compose.yaml,絕大部分語法都相容,基本上裝好新版 Docker 不用再裝 docker-compose,把原本的 docker-compose up -d 改成 docker compose up -d 就無痛升級了。
  4. V2 建議的設定檔名為 compose.yaml,但沿用 docker-compose.yaml 也 OK,給 V2 的 docker-compose.yaml 不再需要第一行 version: "3" 版本宣告,
  5. V2 跟 V1 的一些小差異:
    • V1 的容器名稱用 _ 當連接符號,V2 則改 - 更符合一般習慣,可直接當成 DNS 命名(例如:myproject-svc-1)。使用 --compatibility 可恢復 V1 的底線命名,但不建議使用。
    • 兩個不再支援的 V1 指令:docker-compose scale(但可改用 docker compose up --scale)、docker-compose rm --all
  6. V2 對於環境變數有更明確的套用優先順序(多個來源同名變數衝突時,明確定義誰覆蓋誰),.env 插值規範清楚(如何展開 ${VAR},以及 .env 讀取與套用規則),並提供複雜範例說明
    套用順序為:CLI -e/--env、經由 shell 或 .env/--env-file 插值到 environment/env_file、Compose 檔的 environment、Compose 檔的 env_file、映像檔 Dockerfile 的 ENV 指令。
    docker compose config 可預覽設定內容以確認環境變數套用符合預期:
  7. V1 的最終版為 1.29.2 (2021-05-10),不提供官方支援,也不再有安全更新,已不建議繼續使用。

延伸閱讀:讀者吳承諺另有一篇深入一點的整理 Docker Compose by Inside My Mind


Comments

# by Switch

看到黑大踩到一樣的坑,頓感欣慰(?) 去年回來業界時發現以前在實驗室用 docker-compose 都用得好好的,怎麼現在就用不了了,免不了一頓亂噴

Post a comment