參考官方文檔:https://docs.docker.com/compose/migrate/
遷移至 Docker Compose V2 的教學
Docker Compose V2 是 Docker 平台的一部分,提供了一個全新的內部架構,改善了 CLI 使用體驗,並透過 BuildKit 提升了建構效能,同時也繼續開發新功能。
大多數專案在遷移至 Compose V2 時,不需要對 Compose YAML 或開發流程進行任何更改。
docker-compose vs docker compose
不同於 Compose V1,Compose V2 整合到 Docker CLI 平台中,推薦的命令行語法是 .docker compose
。
Docker CLI 平台提供了一組一致且可預測的選項和標誌,例如環境變數或命令行標誌 DOCKER_HOST--context
。
這個改變使得所有的共享標誌可以在根命令上使用。例如,可以從 Docker 引擎啟用調試日誌記錄,並確保連接時使用 TLS。dockerdocker --log-level=debug --tls compose up
透過將連字符 (-
) 替換為空格,使用 .docker compose
命令來更新腳本,取代了原來的 docker-compose
命令。
服務容器名稱
Compose 會根據專案名稱、服務名稱和規模/副本數量來生成容器名稱。
在 Compose V1 中,使用下劃線 (_
) 作為單詞分隔符。在 Compose V2 中,改為使用連字符 (-
) 作為單詞分隔符。
下劃線在 DNS 主機名中不是有效字符。使用連字符 (-
),Compose V2 確保可以透過網絡以一致、可預測的主機名訪問服務容器。
例如,使用 Compose 命令運行後,Compose V1 生成的容器名稱是 svcmyproject_svc_1
,Compose V2 生成的容器名稱是 myproject-svc-1
。
在 Compose V2 中,全局標誌或環境變數可以保留 Compose V1 使用下劃線作為單詞分隔符的行為。由於必須在每次運行 Compose V2 命令時指定此選項,我們建議只在過渡到 Compose V2 的過程中使用此選項。--compatibilityCOMPOSE_COMPATIBILITY_
命令行標誌和子命令
Compose V2 仍然支援幾乎所有
Compose V1 的標誌和子命令,因此在大多數情況下,可以將其作為腳本中的替代品使用。
V2 不支援的功能
以下功能在 Compose V1 中已被棄用且在 Compose V2 中不再支援:
docker-compose scale
(改用 docker compose up --scale
)
docker-compose rm --all
在 V2 中不同的行為
以下功能在 Compose V1 和 V2 之間的行為有所不同:
--compatibility
Compose V1:廢棄。根據舊有的模式版本遷移 YAML 字段。
Compose V2:作為容器名稱的單詞分隔符改為使用 -
,以匹配 V1。
ps --filter KEY-VALUE
Compose V1:未記載。允許使用任意服務屬性進行過濾。
Compose V2:只允許使用特定屬性進行過濾,例如 --filter=status=running
。
環境變數
Compose V1 中的環境變數行為並未有正式的文件記錄,且在某些邊緣情況下表現不一致。
對於 Compose V2,環境變數部分涵蓋了優先級以及 .env
檔案插值的說明,並提供了許多例子,涵蓋了複雜情況,例如嵌套引號的轉義。
在升級至 Compose V2 之後,可以運行 docker compose config
命令來預覽已執行插值的配置,以驗證值是否符合預期。
為了保持與 Compose V1 的向後兼容性,通常可以確保字面值(不進行插值的值)使用單引號括起來,並且應該對應進行插值的值使用雙引號括起來。
對於使用 Compose V1 的專案,這對你意味著什麼?
對於大多數專案來說,遷移至 Compose V2 不需要對 Compose YAML 或開發流程進行任何更改。
我們建議你適應新的首選方式來運行 Compose V2,即使用 docker compose
代替 docker-compose
。這提供了額外的靈活性,並消除了兼容性別名的要求。
然而,Docker Desktop 將
繼續支援將命令重定向到 docker-compose
的別名,以方便使用第三方工具和腳本。
如何進行升級?
切換到 Compose V2 最簡單且推薦的方式是確保你使用的是最新版本的 Docker Desktop,該版本包含了 Docker Engine、Docker CLI 平台和 Compose V2。
使用 Docker Desktop,你可以始終透過 docker compose
命令來使用 Compose V2。此外,預設啟用了 "使用 Compose V2" 選項,該選項提供了從 docker-compose
到 docker compose
的別名。
對於 Linux 上的手動安裝,可以透過以下方式獲取 Compose V2:
- 使用 Docker 的存儲庫(建議方法)
- 下載並手動安裝
升級之前還需要了解其他事項嗎?
正在運行的專案的遷移
在 V1 和 V2 中,使用 Compose 項目運行時,將根據比較 Docker Engine 中的實際狀態與解析的專案配置(包括 Compose YAML、環境變數和命令行標誌)來重新創建需要的服務容器,以達到期望的狀態。
由於 Compose V1 和 V2 使用不同的方式命名服務容器,首次使用 V2 在已由 V1 啟動的專案上運行時,將重新創建服務容器並使用更新的名稱。
請注意,即使使用 --compatibility
標誌保留了 V1 命名風格,Compose 在首次由 V2 運行時仍然需要重新創建由 V1 啟動的服務容器以遷移內部狀態。
使用 Docker-in-Docker 運行 Compose V2
Compose V2 現在包含在 Docker 官方映像中。
此外,Docker Hub 上的 docker/compose-bin
映像封裝了最新版本的 Compose V2,供在多階段構建中使用。
如果我仍然希望使用 Compose V1,我還能使用嗎?
是的,你仍然可以下載並安裝 Compose V1 的套件,但如果出現任何問題,Docker 將不再提供支援。
警告:最終的 Compose V1 發行版(v1.29.2)是在 2021 年 5 月 10 日。自那時以來,這些套件沒有接收到任何安全更新。請自行承擔使用風險。