我有一個docker-compose.override.yml檔案,它啟動 10 個不同的服務,這些服務僅在容器名稱和它們運行的??命令上有所不同。他們還需要各種環境變數、幾個卷等。
該檔案看起來像這樣,但它有 10 個部分,每個部分實際上有更多的配置。
我不喜歡所有的重復。
有沒有辦法將所有公共配置部分移動到其他地方并讓所有服務使用這些資訊?
也許還有其他解決方案?
version: "3"
services:
service-1:
image: my-image
tty: true
environment:
- APP_ENVIRONMENT=dev
working_dir: /source
volumes:
- .:/source:ro
command: run_services_1
service-2:
image: my-image
tty: true
environment:
- APP_ENVIRONMENT=dev
working_dir: /source
volumes:
- .:/source:ro
command: run_services_2
uj5u.com熱心網友回復:
通過使用YAML 錨點和別名功能,可以輕松實作重用 docker-compose 檔案中的代碼塊。
例如:
services:
service1: &default
image: alpine
environment:
APP_ENVIRONMENT: dev
command: env
service2:
<<: *default
command: echo some other command
service3:
<<: *default
environment:
APP_ENVIRONMENT: prod
對于更高級的情況,您還可以使用以下兩個技巧:
- 僅將配置塊的一部分
&default標記為屬于或其他標記。 - 定義多個標記,并在部分之間創建一種繼承。
這是兩個功能的簡單示例:
services:
bash:
build: .
# Only the below will be used for anyone inheriting from &default
<<: &default
image: me/my-image
environment:
APPENV: dev
web: &web
# Inherit from default
<<: *default
command: env
prod:
# Inherit from web
<<: *web
environment:
APPENV: production
您可以將它與一個簡單的 Dockerfile 一起嘗試,該檔案僅包含FROM alpine或類似的內容。
最后,值得一提的是 docker-compose 支持隱藏的配置塊,他們稱之為擴展欄位。以 開頭的任何內容都將x-被忽略,因此可用于定義模板,例如:
x-service: &service
depends_on: [nginx]
restart: always
services:
service1:
<<: *service
command: ...
service2:
<<: *service
command: ...
image: ...
作為一個小提示:version: 3從您的檔案中洗掉,除非您有特定原因。新的 docker compose 不再需要它。
uj5u.com熱心網友回復:
有一種方法叫做 yml 模板,它看起來像這樣:
version: "3"
services:
service-1: &service_template
image: my-image
tty: true
environment:
- APP_ENVIRONMENT=dev
working_dir: /source
volumes:
- .:/source:ro
command: run_services_1
service-2:
<<: *service_template
command: run_services_2
您想要覆寫的所有內容只需將其寫入使用定義模板的服務中,例如示例中的“命令”引數。
有關更多示例,請訪問https://medium.com/@kinghuang/docker-compose-anchors-aliases-extensions-a1e4105d70bd
uj5u.com熱心網友回復:
您在 Compose 檔案中顯示的許多詳細資訊實際上并不需要是運行時配置;您可以在 Dockerfile 中設定它們。
WORKDIR /source # replaces Compose working_dir:
COPY . ./ # application built into the image, so no Compose volumes:
# ENV APP_ENVIRONMENT=dev # if this is a build-time parameter
CMD run_default_command # good practice
您通常不需要指定tty: true(一個突出的create-react-app 錯誤需要stdin_open: true)。您的 Compose 檔案沒有指定這些,但您通常也不需要提供network:或container_name:選項,因為 Compose默認提供合理的網路設定。
因此,如果您可以在影像中指定環境變數,則最好的情況如下:
version: '3.8'
services:
service-1:
image: my-image
command: run_service_1
service-2:
image: my-image
command: run_service_2
# ports: [...]
在實踐中,您可能確實需要一些運行時配置,并且可能需要跨服務重復。一個常見的技巧是結合使用YAML 別名節點和Compose 擴展欄位來擁有一個環境變數定義塊并將它們包含在其他服務中:
version: '3.8'
x-environment: &environment
- APP_ENVIRONMENT=dev
services:
service-1:
image: my-image
environment: *environment
command: run_service_1
Compose 還支持 YAML 的合并型別,如果environment:是映射,則可以擴展此串列:
x-environment: &environment
APP_ENVIRONMENT: dev
services:
service-1:
image: my-image
command: run_service_1
environment:
<< : *environment
EXTERNAL_SERVICE_URL: http://external.example.com
您可以使用相同的技術來提供任意額外的 Compose 設定,但依賴 Compose 的默認值和影像內置設定通常更容易撰寫和閱讀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/347322.html
