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

Ser*_*nov 39 docker docker-compose

是否可以重用多个容器之间共享的环境变量以避免重复,如下例所示:

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 
Run Code Online (Sandbox Code Playgroud)

Wol*_*hin 55

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

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

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

    泊坞窗,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'
    
    Run Code Online (Sandbox Code Playgroud)
  2. env_file指令

    泊坞窗,compose.yml

    version: '3.2'
    
    services:
      some_service:
        image: someimage
        env_file:
          - 'variables.env'
    
      another_service:
        image: anotherimage
        env_file:
          - 'variables.env'
    
    Run Code Online (Sandbox Code Playgroud)

    variables.env

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

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

    泊坞窗,compose.yml

    version: '3.2'
    
    services:
      some_service:
        image: someimage
        environment:
          - VARIABLE
    
      another_service:
        image: anotherimage
        environment:
          - VARIABLE
          - ANOTHER_VARIABLE
    
    Run Code Online (Sandbox Code Playgroud)

    .ENV

    VARIABLE=some_value
    ANOTHER_VARIABLE=another_value
    
    Run Code Online (Sandbox Code Playgroud)

  • 对于那些不太熟悉 YAML 的人:请参阅 YAML 中的“合并关键语言”,了解符号==&gt;环境的原因:&lt;&lt;:*common-variables。基本上 &amp;foo 表示“foo 将是一个重用变量”,*foo 表示重用变量,&lt;&lt;:将后面的变量映射插入到当前键中。我会编辑,但据说编辑队列由于某种原因已满。 (6认同)

lar*_*sks 26

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

version: '2'

services:
  base:
    environment:
      DB_URL: https://db:8443
      DB_USER_NAME: admin
      DB_USER_PASSWORD: admin 
Run Code Online (Sandbox Code Playgroud)

然后在你的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
Run Code Online (Sandbox Code Playgroud)

然后在里面container1,你会看到:

DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin
Run Code Online (Sandbox Code Playgroud)

container2你内心会看到:

DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin
ANOTHERVAR=this is a test
Run Code Online (Sandbox Code Playgroud)

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


Tha*_*nja 5

您可以从 docker-compose 文件中引用本地环境变量。假设您想要做的是USER_NAME与以下内容相同DB_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}
Run Code Online (Sandbox Code Playgroud)

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

$ USERNAME="admin" PASSWORD="admin" docker-compose up
Run Code Online (Sandbox Code Playgroud)

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

$ printf '%s\n%s\n' 'export USERNAME="admin"' 'export PASSWORD="admin"' >> ~/.bash_profile
$ source ~/.bash_profile
$ docker-compose up
Run Code Online (Sandbox Code Playgroud)

  • 我认为``$ USERNAME =“admin”PASSWORD =“admin”docker-compose up```不好。黑客喜欢“$history”并使用historycmd获取密码 (5认同)
  • @ChangwooRhee 如果您在本地使用 docker-compose 的敏感凭据,则会遇到与技术无关的问题 (2认同)