從 Docker Compose v1 遷移至 v2
自 2023 年 7 月起,Compose v1 已停止接收更新。它也不再包含於 Docker Desktop 的新版本中。
Compose v2 於 2020 年首次發布,現已內建於所有目前支援的 Docker Desktop 版本中。它提供了更佳的 CLI 體驗、利用 BuildKit 提升的建置效能,以及持續開發的新功能。
如何切換到 Compose v2?
最簡單且推薦的方式是確保您安裝了最新版本的 Docker Desktop,該版本已整合 Docker Engine 和 Docker CLI 平台(包含 Compose v2)。
使用 Docker Desktop 時,可以隨時透過 docker compose 指令存取 Compose v2。
對於 Linux 上的手動安裝,您可以透過以下方式取得 Compose v2:
Compose v1 和 Compose v2 之間有什麼區別?
docker-compose 與 docker compose
與 Compose v1 不同,Compose v2 已整合至 Docker CLI 平台,建議使用的命令列語法為 docker compose。
Docker CLI 平台提供了一致且可預測的選項與旗標集合,例如 DOCKER_HOST 環境變數或 --context 命令列旗標。
此變更讓您能夠使用根指令 docker 的所有共用旗標。例如,docker --log-level=debug --tls compose up 不僅能啟用 Docker Engine 的除錯日誌記錄,還能確保連線使用 TLS。
提示請更新指令碼,將連字號 (
-) 替換為空格,改用docker compose而非docker-compose,即可開始使用 Compose v2。
服務容器名稱
Compose 會根據專案名稱、服務名稱以及擴展/副本數量來產生容器名稱。
在 Compose v1 中,使用底線 (_) 作為單字分隔符。而在 Compose v2 中,則使用連字號 (-) 作為分隔符。
底線在 DNS 主機名稱中不是有效字元。透過使用連字號,Compose v2 確保服務容器可以透過一致且可預測的主機名稱在網路上被存取。
例如,執行 Compose 指令 -p myproject up --scale=1 svc,使用 Compose v1 會產生名為 myproject_svc_1 的容器,而使用 Compose v2 則會產生名為 myproject-svc-1 的容器。
提示在 Compose v2 中,全域
--compatibility旗標或COMPOSE_COMPATIBILITY環境變數可以保留 Compose v1 的行為,即使用底線 (_) 作為分隔符。由於此選項必須在每次執行 Compose v2 指令時指定,建議僅將其作為過渡至 Compose v2 時的臨時措施。
命令列旗標與子指令
Compose v2 支援幾乎所有 Compose v1 的旗標與子指令,因此在大多數情況下,它可作為指令碼中的直接替代品。
v2 不支援的功能
以下內容在 Compose v1 中已棄用,且在 Compose v2 中不受支援:
docker-compose scale。請改用docker compose up --scale。docker-compose rm --all
v2 中的行為差異
以下項目在 Compose v1 與 v2 之間的行為有所不同:
| Compose v1 | Compose v2 | |
|---|---|---|
--compatibility | 已棄用。基於舊版架構版本遷移 YAML 欄位。 | 使用 _ 作為容器名稱的單字分隔符而非 -,以匹配 v1。 |
ps --filter KEY-VALUE | 未記錄。允許依任意服務屬性進行篩選。 | 僅允許依特定屬性進行篩選,例如 --filter=status=running。 |
環境變數
Compose v1 中的環境變數行為並未正式記錄,且在某些極端情況下行為不一致。
對於 Compose v2,環境變數 (Environment variables) 章節涵蓋了優先順序以及 .env 檔案插值,並包含了許多處理棘手情況(如逸出巢狀引號)的範例。
請檢查:
- 您的專案是否使用了多層環境變數覆寫(例如同時使用
.env檔案與--envCLI 旗標)。 - 任何
.env檔案值是否包含逸出序列或巢狀引號。 - 任何
.env檔案值是否包含字面上的$符號。這在 PHP 專案中很常見。 - 任何變數值是否使用進階擴充語法,例如
${VAR:?error}。
提示在專案中執行
docker compose config,以預覽 Compose v2 執行插值後的設定,確認數值顯示是否符合預期。通常,透過確保字面值(無插值)使用單引號、需要應用插值的數值使用雙引號,即可保持與 Compose v1 的向後相容性。
這對使用 Compose v1 的專案意味著什麼?
對於大多數專案,切換至 Compose v2 不需要對 Compose YAML 或開發工作流程進行任何更改。
建議您適應執行 Compose v2 的新推薦方式,即使用 docker compose 而非 docker-compose。這提供了額外的靈活性,並消除了對 docker-compose 相容性別名的需求。
不過,Docker Desktop 仍持續支援 docker-compose 別名,將指令重定向至 docker compose,以提升便利性並改善與第三方工具和指令碼的相容性。
切換之前還有什麼需要了解的嗎?
遷移執行中的專案
在 v1 與 v2 中,對 Compose 專案執行 up 指令時,都會根據需要重新建立服務容器。它會將 Docker Engine 中的實際狀態與解析後的專案配置(包含 Compose YAML、環境變數與命令列旗標)進行比較。
由於 Compose v1 和 v2 對服務容器的命名方式不同,首次在原本由 v1 啟動且仍在執行服務的專案上使用 v2 執行 up 指令時,服務容器會以更新後的名稱被重新建立。
請注意,即使使用 --compatibility 旗標來保留 v1 的命名樣式,Compose 為了遷移內部狀態,在 v2 首次執行 up 時,仍需重新建立原本由 v1 啟動的服務容器。
在 Docker-in-Docker 中使用 Compose v2
Compose v2 現已包含在 Docker Hub 上的 Docker 官方映像檔中。
此外,一個全新的 docker/compose-bin 映像檔已上架 Docker Hub,其中封裝了最新版本的 Compose v2,供多階段建置使用。
如果我想用,還能使用 Compose v1 嗎?
是的。您仍然可以下載並安裝 Compose v1 套件,但如果遇到任何問題,將無法獲得 Docker 的支援。
警告Compose v1 的最後一個發行版本為 1.29.2,釋出於 2021 年 5 月 10 日。自那時起,這些套件未再接收任何安全性更新。請自行承擔使用風險。