介绍

在项目中,往往需要在 docker-compose.yml 文件中使用环境变量来控制不同的条件和使用场景,docker-compose支持多级设置环境变量。

docker-compose.yml 文件中引用的环境变量,它们的优先级如下:

Compose file
Shell environment variables
Environment file
Dockerfile
Variable is not defined

注意:

  1. 以上优先级顺序都是指容器引用变量,不包括互相引用。
  2. compose file中只能引用 Shell环境变量、.env 环境文件。引用不到Dockerfile中定义的变量,也引用不了env_file设置的文件中变量。
  3. compose file中的变量是不能互相引用的。即设置一个变量时,引用内部的一个变量则结果是空值。
  4. composefile中通过$ 符号引用环境变量,不支持 ${var:-value},${var:=value},${var:default}等语法。从version:'3' 开始支持 ${var:-value}
  5. 很多默认值,则可以使用 .env 环境变量文件解决。
  6. docker-compose.yml中引用的变量
  7. /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/xxxx/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/xxxx/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/xxxx/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的行为。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐