擴充套件您的 Compose 檔案
Docker Compose 的 extends
屬性 允許您在不同的檔案甚至不同的專案之間共享通用配置。
如果您的多個服務重複使用一組通用的配置選項,則擴充套件服務非常有用。使用 extends
,您可以在一個地方定義一組通用的服務選項,並在任何地方引用它。您可以引用另一個 Compose 檔案,並選擇要用於您自己的應用程式的服務,並能夠為自己的需求覆蓋一些屬性。
重要
當您使用多個 Compose 檔案時,您必須確保所有檔案中的路徑都相對於基本 Compose 檔案(即您主專案資料夾中的 Compose 檔案)。這是必需的,因為擴充套件檔案不必是有效的 Compose 檔案。擴充套件檔案可以包含配置的小片段。跟蹤哪個服務片段相對於哪個路徑很困難且令人困惑,因此為了使路徑更易於理解,所有路徑都必須相對於基本檔案定義。
工作原理
從另一個檔案擴充套件服務
以以下示例為例
services:
web:
extends:
file: common-services.yml
service: webapp
這會指示 Compose 僅重新使用 common-services.yml
檔案中定義的 webapp
服務的屬性。webapp
服務本身不是最終專案的一部分。
如果 common-services.yml
看起來像這樣
services:
webapp:
build: .
ports:
- "8000:8000"
volumes:
- "/data"
您將獲得與直接在 web
下定義相同的 build
、ports
和 volumes
配置值一樣的結果。
要將 webapp
服務包含在最終專案中,當您從另一個檔案擴充套件服務時,您需要在當前的 Compose 檔案中顯式包含這兩個服務。例如(請注意,這是一個非規範性示例)
services:
web:
build: alpine
command: echo
extends:
file: common-services.yml
service: webapp
webapp:
extends:
file: common-services.yml
service: webapp
或者,您可以使用 include。
在同一個檔案中擴充套件服務
如果您在同一個 Compose 檔案中定義服務,並將一個服務從另一個服務擴充套件,那麼原始服務和擴充套件服務都將成為您最終配置的一部分。例如
services:
web:
build: alpine
extends: webapp
webapp:
environment:
- DEBUG=1
在同一個檔案和另一個檔案中擴充套件服務
您可以更進一步,在 compose.yaml
中本地定義或重新定義配置
services:
web:
extends:
file: common-services.yml
service: webapp
environment:
- DEBUG=1
cpu_shares: 5
important_web:
extends: web
cpu_shares: 10
其他示例
當您有多個服務具有通用配置時,擴充套件單個服務非常有用。以下示例是一個具有兩個服務的 Compose 應用程式,一個 Web 應用程式和一個佇列工作程式。這兩個服務都使用相同的程式碼庫,並共享許多配置選項。
common.yaml
檔案定義了通用配置
services:
app:
build: .
environment:
CONFIG_FILE_PATH: /code/config
API_KEY: xxxyyy
cpu_shares: 5
docker-compose.yaml
定義了使用通用配置的具體服務
services:
webapp:
extends:
file: common.yaml
service: app
command: /code/run_web_app
ports:
- 8080:8080
depends_on:
- queue
- db
queue_worker:
extends:
file: common.yaml
service: app
command: /code/run_worker
depends_on:
- queue
異常和限制
volumes_from
和 depends_on
從未使用 extends
在服務之間共享。這些異常存在是為了避免隱式依賴關係;您始終在本地定義 volumes_from
。這確保了在讀取當前檔案時,服務之間的依賴關係清晰可見。在本地定義這些內容還可以確保對引用檔案的更改不會破壞任何內容。
如果您只需要共享一個服務,並且您熟悉要擴充套件的檔案,以便您可以調整配置,那麼 extends
非常有用。但是,當您想要重用其他人的不熟悉配置並且您不知道其自己的依賴關係時,這不是一個可接受的解決方案。
相對路徑
當使用包含指向另一個資料夾的 file
屬性的 extends
時,被擴充套件服務宣告的相對路徑將被轉換,以便它們在被擴充套件服務使用時仍然指向相同的檔案。以下示例說明了這一點
基本 Compose 檔案
services:
webapp:
image: example
extends:
file: ../commons/compose.yaml
service: base
commons/compose.yaml
檔案
services:
base:
env_file: ./container.env
結果服務引用 commons
目錄中的原始 container.env
檔案。這可以透過 docker compose config
確認,它會檢查實際模型
services:
webapp:
image: example
env_file:
- ../commons/container.env