繁体   English   中英

在 docker-compose.yml 中重用环境变量

[英]Re-using environment variables in docker-compose.yml

是否可以重用在多个容器之间共享的环境变量?

这个想法是为了避免重复,如下例所示:

version: '2'

services:

  db:
    image: example/db
    ports:
      - "8443:8443" 
    container_name: db
    hostname: db
    environment:
      - USER_NAME = admin 
      - USER_PASSWORD = admin 

svc:
  image: example/svc
  depends_on:
    - db
  ports:
    - "9443:9443"
  container_name: svc
  hostname: svc
  environment:
    - DB_URL = https://db:8443
    - DB_USER_NAME = admin
    - DB_USER_PASSWORD = admin 

extends选项可能很好,但它在3.x撰写文件中不受支持 其他的方法是:

  1. 扩展字段(撰写文件 3.4+)

    如果您可以使用 3.4+ 撰写文件,扩展字段可能是最佳选择:

    docker-compose.yml

     version: '3.4' x-common-variables: &common-variables VARIABLE: some_value ANOTHER_VARIABLE: another_value services: some_service: image: someimage environment: *common-variables another_service: image: anotherimage environment: <<: *common-variables NON_COMMON_VARIABLE: 'non_common_value'
  2. env_file指令

    docker-compose.yml

     version: '3.2' services: some_service: image: someimage env_file: - 'variables.env' another_service: image: anotherimage env_file: - 'variables.env'

    变量.env

     VARIABLE=some_value ANOTHER_VARIABLE=another_value
  3. 项目根目录中的.env 文件(或实际撰写环境中的变量)

    可以在服务配置中引用 .env 文件中的变量:

    docker-compose.yml

     version: '3.2' services: some_service: image: someimage environment: - VARIABLE another_service: image: anotherimage environment: - VARIABLE - ANOTHER_VARIABLE

    .env

     VARIABLE=some_value ANOTHER_VARIABLE=another_value

您可以使用extends指令(在 compose 1.x2.x可用)让多个容器从底层服务描述继承environment配置。 例如,将以下内容放入名为base.yml的文件中:

version: '2'

services:
  base:
    environment:
      DB_URL: https://db:8443
      DB_USER_NAME: admin
      DB_USER_PASSWORD: admin 

然后在你docker-compose.yml

version: '2'

services:
  container1:
    image: alpine
    command: sh -c "env; sleep 900"
    extends:
      file: base.yml
      service: base

  container2:
    image: alpine
    command: sh -c "env; sleep 900"
    extends:
      file: base.yml
      service: base
    environment:
      ANOTHERVAR: this is a test

然后在container1内部,您将看到:

DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin

container2里面你会看到:

DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin
ANOTHERVAR=this is a test

显然,您可以将extends用于environment指令以外的内容; 这是使用 docker-compose 时避免重复的好方法。

您可以从 docker-compose 文件中引用本地环境变量。 假设您想要做的是使USER_NAMEDB_USER_NAME相同:

docker-compose.yml

version: '2'

services:
  db:
    image: example/db
    ports:
      - "8443:8443" 
    container_name: db
    hostname: db
    environment:
      - USER_NAME = ${USERNAME}
      - USER_PASSWORD = ${PASSWORD}

svc:
  image: example/svc
  depends_on:
    - db
  ports:
    - "9443:9443"
  container_name: svc
  hostname: svc
  environment:
    - DB_URL = https://db:8443
    - DB_USER_NAME = ${USERNAME}
    - DB_USER_PASSWORD = ${PASSWORD}

然后,像这样运行 docker-compose:

$ USERNAME="admin" PASSWORD="admin" docker-compose up

或者,对于更持久且更易于重复输入的内容:

$ printf '%s\n%s\n' 'export USERNAME="admin"' 'export PASSWORD="admin"' >> ~/.bash_profile
$ source ~/.bash_profile
$ docker-compose up

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM