組合多個docker-compose檔案
一個服務,一般有開發、整合、測試、生產等多個環境。
在不同環境下,往往又需要不同的配置。
這時,一個docker-compose.yml
檔案就難以應付了。
不過,它通過擴充套件(Extending),對此提供了支援。
Using multiple Compose files enables you to customize a Compose application for different environments or different workflows.
參考:ofollow,noindex" target="_blank">Share Compose configurations between files and projects | Docker Documentation
docker-compose.override.yml
以下以一個docker-compose.yml
和docker-compose.override.yml
為例,展示override的用法。
version: '3' services: nginx: image: nginx:stable-alpine ports: - 127.0.0.1:8080:80 environment: - TEST_0=0 - DEBUG=true
新建一個test
目錄,把以上內容寫入其中。
當只有一個docker-compose.yml
時,啟動後會使用8080
埠。
$ docker-compose up -d Creating network "test_default" with the default driver Creating test_nginx_1 ... done $ docker-compose ps NameCommandStatePorts ------------------------------------------------------------------------------------- test_nginx_1nginx -g daemon off;Up0.0.0.0:8080->80/tcp,0.0.0.0:80->80/tcp docker-compose exec nginx sh / # echo $TEST_0 0 / # echo $DEBUG true
如果再增加一個docker-compose.override.yml
,那麼情況會發生變化。
version: '3' services: nginx: ports: - 80:80 environment: - TEST_1=1 - DEBUG=false
執行結果如下:
$ docker-compose down Stopping test_nginx_1 ... done Removing test_nginx_1 ... done Removing network test_default $ docker-compose up -d Creating network "test_default" with the default driver Creating test_nginx_1 ... done $ docker-compose ps NameCommandStatePorts --------------------------------------------------------------------------------------- test_nginx_1nginx -g daemon off;Up0.0.0.0:80->80/tcp,127.0.0.1:8080->80/tcp $ docker-compose exec nginx sh / # echo $TEST_0 0 / # echo $TEST_1 0 / # echo $DEBUG false
執行結果是二者的並集。
相同的部分,並非簡單的override的關係,而是先後執行。$DEBUG
變成false
,不是因為二取一,而是因為docker-compose.override.yml
後執行,環境變數被第二次賦值所覆蓋。
如果對外部的同一個port進行操作,比如docker-compose.override.yml
也使用8080
埠,程式就會報錯。
$ docker-compose up -d Creating network "test_default" with the default driver Creating test_nginx_1 ... error ERROR: for test_nginx_1Cannot start service nginx: driver failed programming external connectivity on endpoint test_nginx_1 (c07b1fba8aa720b19fce92053f5b21bf5d8f87816364402032e2401914497601): Error starting userland proxy: listen tcp 0.0.0.0:8080: bind: address already in use ERROR: for nginxCannot start service nginx: driver failed programming external connectivity on endpoint test_nginx_1 (c07b1fba8aa720b19fce92053f5b21bf5d8f87816364402032e2401914497601): Error starting userland proxy: listen tcp 0.0.0.0:8080: bind: address already in use ERROR: Encountered errors while bringing up the project.
多個-f
引數
其實,以上現象,相當於:
docker-compose \ -f docker-compose.yml \ -f docker-compose.override.yml \ up
如果希望docker-compose.yml
反過來覆蓋docker-compose.override.yml
,可以這樣執行:
$ docker-compose -f docker-compose.override.yml -f docker-compose.yml up -d Creating network "test_default" with the default driver Creating test_nginx_1 ... done $ docker-compose exec nginx sh / # echo $DEBUG true
多個-f
引數,可以指定compose檔案的組合順序,也就可以控制override關係。
總結
需要注意的是,override只對預設的docker-compose.yml
(或docker-compose.yaml
)生效。docker-compose.yml
作為提交到程式碼庫的東西,有些不方便直接配置的東西,
比如生產環境的密碼、生產環境相關的資源配置等,這些都可以通過override的擴充套件來代為配置。
在不同的環境,可以寫不同的docker-compose.override.yml
。
這樣,就可以實現開發、整合、測試、生產等不同環境的不同要求。
除了override以外,同樣可以自定義若干YAML檔案,甚至不以docker-compose
為名,利用-f
進行組合來達成相同目的。
雖然不太方便,但這樣更靈活。
即使不使用擴充套件機制,也可以把所有服務分成多組,放在不同的YAML檔案中,實現更靈活的按需啟動。