Re-using environment variables in docker-compose.yml

后端 未结 3 2088
隐瞒了意图╮
隐瞒了意图╮ 2020-12-07 16:45

Is it possible to re-use environment variables that are shared among multiple containers?

The idea is to avoid duplication, as illustrated in this example:



        
相关标签:
3条回答
  • 2020-12-07 17:08

    You can use the extends directive (available in compose 1.x and 2.x) to have multiple containers inherit the environment configuration from an underlying service description. For example, put the following in a file named base.yml:

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

    Then in your 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
    

    Then inside of container1, you will see:

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

    And inside of container2 you will see:

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

    You can obviously use extends for things other than the environment directive; it's a great way to avoid duplication when using docker-compose.

    0 讨论(0)
  • 2020-12-07 17:09

    You can reference local environment variables from within a docker-compose file. Assuming what you're wanting to do is make USER_NAME the same as 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}
    

    Then, run docker-compose like:

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

    Alternately, for something more permanent, and easier to type on a recurring basis:

    $ printf '%s\n%s\n' 'export USERNAME="admin"' 'export PASSWORD="admin"' >> ~/.bash_profile
    $ source ~/.bash_profile
    $ docker-compose up
    
    0 讨论(0)
  • 2020-12-07 17:13

    The extends option can be nice but it's not supported in 3.x compose files. Other ways to go are:

    1. Extension fields (compose file 3.4+)

      If you can use 3.4+ compose files, extension fields are probably the best option:

      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 directive

      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 in project root (or variables at actual compose environment)

      Variables from .env file can be referenced in service configuration:

      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
      
    0 讨论(0)
提交回复
热议问题