合併 Compose 檔案
Docker Compose 允許您合併和覆蓋一組 Compose 檔案以建立複合 Compose 檔案。
預設情況下,Compose 讀取兩個檔案,一個 compose.yaml
和一個可選的 compose.override.yaml
檔案。按照慣例,compose.yaml
包含您的基本配置。覆蓋檔案可以包含現有服務的配置覆蓋或全新的服務。
如果一個服務在兩個檔案中都定義了,Compose 會使用下面描述的規則和 Compose 規範 中的規則合併配置。
如何合併多個 Compose 檔案
要使用多個覆蓋檔案,或使用不同名稱的覆蓋檔案,您可以使用預定義的 COMPOSE_FILE 環境變數,或使用 -f
選項指定檔案列表。
Compose 按照命令列中指定的順序合併檔案。後續檔案可能會合並、覆蓋或新增到其前身。
例如:
$ docker compose -f compose.yaml -f compose.admin.yaml run backup_db
compose.yaml
檔案可能指定一個 webapp
服務。
webapp:
image: examples/web
ports:
- "8000:8000"
volumes:
- "/data"
compose.admin.yaml
也可能指定相同的服務。
webapp:
environment:
- DEBUG=1
任何匹配的欄位都會覆蓋前一個檔案。新值會新增到 webapp
服務配置中。
webapp:
image: examples/web
ports:
- "8000:8000"
volumes:
- "/data"
environment:
- DEBUG=1
合併規則
路徑是相對於基礎檔案評估的。當您使用多個 Compose 檔案時,必須確保所有檔案中的路徑都相對於基礎 Compose 檔案(使用
-f
指定的第一個 Compose 檔案)。這是必需的,因為覆蓋檔案不必是有效的 Compose 檔案。覆蓋檔案可以包含配置的小片段。跟蹤服務的哪個片段相對於哪個路徑是困難和令人困惑的,因此為了使路徑更容易理解,所有路徑都必須相對於基礎檔案定義。提示您可以使用
docker compose config
來檢視合併後的配置並避免與路徑相關的問題。Compose 將原始服務的配置複製到本地服務。如果配置選項在原始服務和本地服務中都定義了,則本地值將替換或擴充套件原始值。
對於
image
、command
或mem_limit
等單值選項,新值會替換舊值。原始服務
services: myservice: # ... command: python app.py
本地服務
services: myservice: # ... command: python otherapp.py
結果
services: myservice: # ... command: python otherapp.py
對於多值選項
ports
、expose
、external_links
、dns
、dns_search
和tmpfs
,Compose 會連線兩組值。原始服務
services: myservice: # ... expose: - "3000"
本地服務
services: myservice: # ... expose: - "4000" - "5000"
結果
services: myservice: # ... expose: - "3000" - "4000" - "5000"
在
environment
、labels
、volumes
和devices
的情況下,Compose 將條目與本地定義的值合併在一起,本地定義的值優先。對於environment
和labels
,環境變數或標籤名稱決定使用哪個值。原始服務
services: myservice: # ... environment: - FOO=original - BAR=original
本地服務
services: myservice: # ... environment: - BAR=local - BAZ=local
結果
services: myservice: # ... environment: - FOO=original - BAR=local - BAZ=local
volumes
和devices
的條目使用容器中的掛載路徑合併。原始服務
services: myservice: # ... volumes: - ./original:/foo - ./original:/bar
本地服務
services: myservice: # ... volumes: - ./local:/bar - ./local:/baz
結果
services: myservice: # ... volumes: - ./original:/foo - ./local:/bar - ./local:/baz
有關更多合併規則,請參閱 Compose 規範中的 合併和覆蓋。
附加資訊
使用
-f
是可選的。如果未提供,Compose 會在工作目錄及其父目錄中搜索compose.yaml
和compose.override.yaml
檔案。您必須至少提供compose.yaml
檔案。如果兩個檔案位於同一目錄級別,Compose 會將它們組合成一個配置。您可以使用
-f
和-
(破折號)作為檔名從stdin
讀取配置。例如:$ docker compose -f - <<EOF webapp: image: examples/web ports: - "8000:8000" volumes: - "/data" environment: - DEBUG=1 EOF
當使用
stdin
時,配置中的所有路徑都相對於當前工作目錄。您可以使用
-f
標誌指定不在當前目錄中的 Compose 檔案的路徑,無論是從命令列還是透過在您的 shell 或環境檔案中設定 COMPOSE_FILE 環境變數。例如,如果您正在執行 Compose Rails 示例,並且在名為
sandbox/rails
的目錄中有一個compose.yaml
檔案。您可以使用類似 docker compose pull 的命令透過以下方式使用-f
標誌從任何地方獲取db
服務的 postgres 映象:docker compose -f ~/sandbox/rails/compose.yaml pull db
這是完整的示例:
$ docker compose -f ~/sandbox/rails/compose.yaml pull db Pulling db (postgres:latest)... latest: Pulling from library/postgres ef0380f84d05: Pull complete 50cf91dc1db8: Pull complete d3add4cd115c: Pull complete 467830d8a616: Pull complete 089b9db7dc57: Pull complete 6fba0a36935c: Pull complete 81ef0e73c953: Pull complete 338a6c4894dc: Pull complete 15853f32f67c: Pull complete 044c83d92898: Pull complete 17301519f133: Pull complete dcca70822752: Pull complete cecf11b8ccf3: Pull complete Digest: sha256:1364924c753d5ff7e2260cd34dc4ba05ebd40ee8193391220be0f9901d4e1651 Status: Downloaded newer image for postgres:latest
示例
多檔案的一個常見用例是將開發 Compose 應用程式更改為生產環境(可以是生產、staging 或 CI)。為了支援這些差異,您可以將 Compose 配置拆分為幾個不同的檔案。
從定義服務規範配置的基礎檔案開始。
compose.yaml
services:
web:
image: example/my_web_app:latest
depends_on:
- db
- cache
db:
image: postgres:latest
cache:
image: redis:latest
在此示例中,開發配置將某些埠公開給主機,將我們的程式碼掛載為卷,並構建 web 映象。
compose.override.yaml
services:
web:
build: .
volumes:
- '.:/code'
ports:
- 8883:80
environment:
DEBUG: 'true'
db:
command: '-d'
ports:
- 5432:5432
cache:
ports:
- 6379:6379
當您執行 docker compose up
時,它會自動讀取覆蓋。
要在生產環境中使用此 Compose 應用程式,需要建立另一個覆蓋檔案,該檔案可能儲存在不同的 git 儲存庫中或由不同的團隊管理。
compose.prod.yaml
services:
web:
ports:
- 80:80
environment:
PRODUCTION: 'true'
cache:
environment:
TTL: '500'
要使用此生產 Compose 檔案進行部署,您可以執行:
$ docker compose -f compose.yaml -f compose.prod.yaml up -d
這會使用 compose.yaml
和 compose.prod.yaml
中的配置部署所有三個服務,但不使用 compose.override.yaml
中的開發配置。
有關更多資訊,請參閱 在生產中使用 Compose。
限制
Docker Compose 支援應用程式模型中包含的許多資源的相對路徑:服務映象的構建上下文、定義環境變數的檔案位置、用於繫結掛載卷的本地目錄路徑。有了這樣的約束,單體倉庫中的程式碼組織會變得很困難,因為自然的C選擇是為每個團隊或元件設定專用資料夾,但這樣 Compose 檔案的相對路徑就變得不相關了。