介绍
在项目中,往往需要在 docker-compose.yml 文件中使用环境变量来控制不同的条件和使用场景,docker-compose支持多级设置环境变量。
docker-compose.yml 文件中引用的环境变量,它们的优先级如下:
Compose file
Shell environment variables
Environment file
Dockerfile
Variable is not defined
注意:
- 以上优先级顺序都是指容器引用变量,不包括互相引用。
- compose file中只能引用 Shell环境变量、
.env
环境文件。引用不到Dockerfile中定义的变量,也引用不了env_file设置的文件中变量。- compose file中的变量是不能互相引用的。即设置一个变量时,引用内部的一个变量则结果是空值。
- composefile中通过$ 符号引用环境变量,不支持 ${var:-value},${var:=value},${var:default}等语法。从
version:'3'
开始支持 ${var:-value}- 很多默认值,则可以使用 .env 环境变量文件解决。
- docker-compose.yml中引用的变量
- /etc/profile等变量并不会对容器生效。参考:https://hhoeflin.github.io/2020/08/19/bash-in-docker/
查看当前配置命令
docker-compose config
环境变量的设置方式
compose file
version: '2'
services:
data-tag-biz:
image: 192.168.1.XX/jurassic/data-standard-biz:9.0
network_mode: "host"
restart: always
ports:
- 10015:9015
environment:
- NACOS-HOST=${
NACOS_HOST}
- SW_NAME=test:${
SV_NAME}
- SW_SERVICES=192.168.1.XX:11800
- TRACK=-javaagent:/opt/skywalking-agent.jar
- JAVA_OPTS=-Xms512m -Xmx1024m -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
container_name: data-standard-biz-9
shell环境变量
export SV_NAME=data-standard-biz
环境变量文件
docker原生命令
docker run --env-file=web-variables.env
docker file中指定
version: '3'
services:
data-tag-biz:
env_file:
- file.env #相对于docker-compose.yml文件的位置。
environment:
- SV_NAME=data-standard-biz
- NACOS-HOST=${
NACOS_HOST}
- SW_NAME=test:${
SV_NAME}
- SW_SERVICES=192.168.1.XX:11800
- TRACK=-javaagent:/opt/skywalking-agent.jar
- JAVA_OPTS=-Xms512m -Xmx1024m -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
container_name: data-standard-biz-9
#file.env
SV_NAME=data-standard-biz-envfile
ENV_VALUE=env-value
NOOP=NO OP KEY
docker-compose config输出:
services:
data-tag-biz:
container_name: data-standard-biz-9
environment:
ENV_FILE: '' #没有引用到的变量ENV_VALUE
ENV_VALUE: env-value # 自动加入的
JAVA_OPTS: -Xms512m -Xmx1024m -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
NACOS-HOST: 192.168.1.XX
NOOP: NO OP KEY #自动加入的。
SV_NAME: data-standard-biz
SW_NAME: test:data-standard-biz-env
SW_SERVICES: 192.168.1.XX:11800
TRACK: -javaagent:/opt/skywalking-agent.jar
image: 192.168.1.36/jurassic/data-standard-biz:9.0
network_mode: host
ports:
- 10015:9015/tcp
restart: always
version: '3.0'
docker-compose文件中的变量是引用不到 环境文件中定义的变量的。环境文件中定义的所有变量是仅相对于容器可见的。
环境变量文件中的所有变量都会自动加到变量列表中,不需要在docker-compose中定义。
.env 文件
在docker-compose.yml同级目录中加入.env
文件,则可以设置docker-compose环境变量的默认值,可以在docker-compose中引用到的。
此文件可以为大量的变量配置默认值,用来代替${var:-defaultvalue}
version: '3'
services:
data-tag-biz:
... ...
environment:
- SV_NAME=data-standard-biz
- NACOS-HOST=${
NACOS_HOST}
- SW_NAME=test:${
SV_NAME} #如果不设置,则默认使用 .env中默认值。
... ...
# .env
SV_NAME=data-standard-biz-env
TEST_ENV=xxxxxxxx
docker-compose config输出:
services:
data-tag-biz:
container_name: data-standard-biz-9
environment:
ENV_FILE: ''
ENV_VALUE: env-value
JAVA_OPTS: -Xms512m -Xmx1024m -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
NACOS-HOST: 192.168.1.XX
NOOP: NO OP KEY
SV_NAME: data-standard-biz
SW_NAME: test:data-standard-biz-env #使用了 .env中默认值。
SW_SERVICES: 192.168.1.XX:11800
TRACK: -javaagent:/opt/skywalking-agent.jar
image: 192.168.1.XX/jurassic/data-standard-biz:9.0
network_mode: host
ports:
- 10015:9015/tcp
restart: always
version: '3.0'
Compose CLI 环境变量
Compose CLI(compose command-line 即 docker-compose 程序)能够识别名称为 COMPOSE_PROJECT_NAME 和 COMPOSE_FILE 等环境变量(具体支持的环境变量请参考这里)。通过设置这些变量可以控制docker-compose的行为。