Docker Compose引用環(huán)境變量的方法示例
在項目中,往往需要在 docker-compose.yml 文件中使用環(huán)境變量來控制不同的條件和使用場景。本文集中介紹 docker compose 引用環(huán)境變量的方式。
說明:本文的演示環(huán)境為 ubuntu 16.04。
Compose CLI 與環(huán)境變量
Compose CLI(compose command-line 即 docker-compose 程序)能夠識別名稱為 COMPOSE_PROJECT_NAME 和 COMPOSE_FILE 等環(huán)境變量(具體支持的環(huán)境變量請參考這里)。比如我們可以通過這兩個環(huán)境變量為 docker-compose 指定 project 的名稱和配置文件:
$ export COMPOSE_PROJECT_NAME=TestVar $ export COMPOSE_FILE=~/projects/composecounter/docker-compose.yml
然后啟動應(yīng)用,顯示的 project 名稱都是我們在環(huán)境變量中指定的:
如果設(shè)置了環(huán)境變量的同時又指定了命令行選項,那么會應(yīng)用命令行選項的設(shè)置:
$ docker-compose -p nickproject up -d
在 compose file 中引用環(huán)境變量
我們還可以在 compose file 中直接引用環(huán)境變量,比如下面的 demo:
version: '3' services: web: image: ${IMAGETAG} ports: - "5000:5000" redis: image: "redis:alpine"
我們通過環(huán)境變量 ${IMAGETAG} 指定了 web 的鏡像,下面通過 export 的方式來為 compose 配置文件中的環(huán)境變量傳值:
注意,如果對應(yīng)的環(huán)境變量沒有被設(shè)置,那么 compose 就會把它替換為一個空字符串:
碰到這種情況,我們可以在 compose 的配置文件中為該變量設(shè)置一個默認值:
version: '3' services: web: image: ${IMAGETAG:-defaultwebimage} ports: - "5000:5000" redis: image: "redis:alpine"
這樣,如果沒有設(shè)置 IMAGETAG 變量,就會應(yīng)用 defaultwebimage:
除了這種方式,我們還可以通過后面將介紹的 .env 文件來為環(huán)境變量設(shè)置默認值。
把環(huán)境變量傳遞給容器
先來看一下在 compose file 中如何為容器設(shè)置環(huán)境變量:
web: environment: DEBUG: 1
compose file 中的 environment 節(jié)點用來為容器設(shè)置環(huán)境變量,上面的寫法等同于:
$ docker run -e DEBUG=1
要把當前 shell 環(huán)境變量的值傳遞給容器的環(huán)境變量也很簡單,去掉上面代碼中的賦值部分就可以了:
web: environment: DEBUG:
這種情況下,如果沒有在當前的 shell 中導(dǎo)出環(huán)境變量 DEBUG,compose file 中會把它解釋為 null:
在試試導(dǎo)出環(huán)境變量 DEBUG 的情況:
$ export DEBUG=1
這才是我們設(shè)計的正確的使用場景!
使用文件為容器設(shè)置多個環(huán)境變量
如果覺得通過 environment 為容器設(shè)置環(huán)境變量不夠過癮,我們還可以像 docker -run 的 --env-file 參數(shù)一樣通過文件為容器設(shè)置環(huán)境變量:
web: env_file: - web-variables.env
注意,web-variables.env 文件的路徑是相對于 docker-compose.yml 文件的相對路徑。上面的代碼效果與下面的代碼相同:
$ docker run --env-file=web-variables.env
web-variables.env 文件中可以定義一個或多個環(huán)境變量:
# define web container env APPNAME=helloworld AUTHOR=Nick Li VERSION=1.0
檢查下結(jié)果:
原來 compose 把 env_file 的設(shè)置翻譯成了 environment!
.env 文件
當我們在 docker-compose.yml 文件中引用了大量的環(huán)境變量時,對每個環(huán)境變量都設(shè)置默認值將是繁瑣的,并且也會影響 docker-compose.yml 簡潔程度。此時我們可以通過 .env 文件來為 docker-compose.yml 文件引用的所有環(huán)境變量設(shè)置默認值!
修改 docker-compose.yml 文件的內(nèi)容如下:
version: '3' services: web: image: ${IMAGETAG} environment: APPNAME: AUTHOR: VERSION: ports: - "5000:5000" redis: image: "redis:alpine"
然后在相同的目錄下創(chuàng)建 .env 文件,編輯其內(nèi)容如下:
# define env var default value. IMAGETAG=defaultwebimage APPNAME=default app name AUTHOR=default author name VERSION=default version is 1.0
檢查下結(jié)果,此時所有的環(huán)境變量都顯示為 .env 文件中定義的默認值:
配置不同場景下的環(huán)境變量
從前面的部分中我們可以看到,docker compose 提供了足夠的靈活性來讓我們設(shè)置 docker-compose.yml 文件中引用的環(huán)境變量,它們的優(yōu)先級如下:
- Compose file
- Shell environment variables
- Environment file
- Dockerfile
- Variable is not defined
首先,在 docker-compose.yml 文件中直接設(shè)置的值優(yōu)先級是最高的。
然后是在當前 shell 中 export 的環(huán)境變量值。
接下來是在環(huán)境變量文件中定義的值。
再接下來是在 Dockerfile 中定義的值。
最后還沒有找到相關(guān)的環(huán)境變量就認為該環(huán)境變量沒有被定義。
根據(jù)上面的優(yōu)先級定義,我們可以把不同場景下的環(huán)境變量定義在不同的 shell 腳本中并導(dǎo)出,然后在執(zhí)行 docker-compose 命令前先執(zhí)行 source 命令把 shell 腳本中定義的環(huán)境變量導(dǎo)出到當前的 shell 中。通過這樣的方式可以減少維護環(huán)境變量的地方,下面的例子中我們分別在 docker-compose.yml 文件所在的目錄創(chuàng)建 test.sh 和 prod.sh,test.sh 的內(nèi)容如下:
#!/bin/bash # define env var default value. export IMAGETAG=web:v1 export APPNAME=HelloWorld export AUTHOR=Nick Li export VERSION=1.0
prod.sh 的內(nèi)容如下:
#!/bin/bash # define env var default value. export IMAGETAG=webpord:v1 export APPNAME=HelloWorldProd export AUTHOR=Nick Li export VERSION=1.0LTS
在測試環(huán)境下,執(zhí)行下面的命令:
$ source test.sh $ docker-compose config
此時 docker-compose.yml 中的環(huán)境變量應(yīng)用的都是測試環(huán)境相關(guān)的設(shè)置。
而在生產(chǎn)環(huán)境下,執(zhí)行下面的命令:
$ source prod.sh $ docker-compose config
此時 docker-compose.yml 中的環(huán)境變量應(yīng)用的都是生產(chǎn)環(huán)境相關(guān)的設(shè)置。
總結(jié)
docker compose 對環(huán)境變量的使用提供了非常豐富支持和靈活的使用方式。希望通過本文的總結(jié)可以幫助大家理清相關(guān)的用法,并能夠以簡潔的方式為不同的使用場景提供支持。
參考:
Compose CLI environment variables
Environment variables in Compose
Compose file variable substitution
Declare default environment variables in file
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Windows Server 2016 安裝 Docker的過程及遇到問題
若要在 Windows Server 上安裝 Docker,可以使用由 Microsoft 發(fā)布的 OneGet 提供程序 PowerShell 模塊,接下來通過本文給大家介紹Windows Server 2016 安裝 Docker的過程及遇到問題,一起看看吧2021-09-09Docker容器host與none網(wǎng)絡(luò)的使用
本文主要介紹了Docker容器host與none網(wǎng)絡(luò)的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧<BR>2022-06-06