【问题标题】:Re-using environment variables in docker-compose.yml在 docker-compose.yml 中重用环境变量
【发布时间】:2016-07-16 23:38:59
【问题描述】:

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

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

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 

【问题讨论】:

    标签: docker docker-compose environment-variables


    【解决方案1】:

    extends 选项可能很好,但它是3.x 撰写文件中的not supported。其他方法是:

    1. Extension fields(撰写文件 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'
      

      variables.env

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

      .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
      

    【讨论】:

    • 对于那些不太熟悉 YAML 的人:关于 notation==> 环境的原因,请参阅 YAML 中的“Merge key language”:
    • @logicOnAbstractions 我的扩展字段文档链接就足够了,那里解释了 YAML 功能
    • docker-compose.yml 中是否可以重复使用扩展字段进行替换?
    【解决方案2】:

    您可以使用extends 指令(可在组合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 时避免重复的好方法。

    【讨论】:

    • extends 非常适合我的用例。它比局部变量更可取,因为它消除了对特定用户的依赖。我可以用extends 做的另一件事是指定通用容器标签。
    • 我可以extends 提供多个服务吗?还是来自每个服务的多个文件?
    • 对于从子目录调用内容时遇到 FileNotFoundError 的其他任何人,您可以改用文件的相对路径:“./base.yml”
    【解决方案3】:

    您可以从 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
    

    【讨论】:

    • 我觉得$ USERNAME="admin" PASSWORD="admin" docker-compose up 不好。像$ history这样的黑客并使用历史cmd获取密码
    • @ChangwooRhee 如果您在本地使用 docker-compose 的敏感凭据,您会遇到与技术无关的问题
    • 本地敏感凭据、非版本化文件等没有任何问题。但是像你一样传递它们会更糟,关于其他东西不好的论点并不能否定它是不好的建议。
    • @James 也许我应该更明确一点:一个人永远不应该在本地拥有敏感凭据。事实上,理想情况下,永远不应该有人知道生产数据库的密码。
    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 2020-12-27
    • 2016-12-07
    • 2019-06-02
    • 2022-11-17
    • 2016-07-07
    相关资源
    最近更新 更多