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

在docker-compose.yml中重复使用环境变量,docker,docker-compose,environment-variables,Docker,Docker Compose,Environment Variables,是否可以重用在多个容器之间共享的环境变量 其目的是避免重复,如本例所示: 版本:“2” 服务: db: 图像:示例/db 端口: - "8443:8443" 容器名称:db 主机名:db 环境: -用户名=管理员 -用户\密码=管理员 svc: 图:示例/svc 取决于: -分贝 端口: - "9443:9443" 容器名称:svc 主机名:svc 环境: -DB_URL=https://db:8443 -DB\u USER\u NAME=admin -DB\u USER\u PASSWORD

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

其目的是避免重复,如本例所示:

版本:“2”
服务:
db:
图像:示例/db
端口:
- "8443:8443" 
容器名称:db
主机名:db
环境:
-用户名=管理员
-用户\密码=管理员
svc:
图:示例/svc
取决于:
-分贝
端口:
- "9443:9443"
容器名称:svc
主机名:svc
环境:
-DB_URL=https://db:8443
-DB\u USER\u NAME=admin
-DB\u USER\u PASSWORD=admin

您可以从docker compose文件中引用本地环境变量。假设您想要做的是使
USER\u NAME
DB\u USER\u 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}
 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'
 version: '3.2'

 services:
   some_service:
     image: someimage
     env_file:
       - 'variables.env'

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

 services:
   some_service:
     image: someimage
     environment:
       - VARIABLE

   another_service:
     image: anotherimage
     environment:
       - VARIABLE
       - ANOTHER_VARIABLE
然后,运行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

您可以从docker compose文件中引用本地环境变量。假设您想要做的是使
USER\u NAME
DB\u USER\u 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}
 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'
 version: '3.2'

 services:
   some_service:
     image: someimage
     env_file:
       - 'variables.env'

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

 services:
   some_service:
     image: someimage
     environment:
       - VARIABLE

   another_service:
     image: anotherimage
     environment:
       - VARIABLE
       - ANOTHER_VARIABLE
然后,运行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
您可以使用指令(在compose
1.x
2.x
中提供)让多个容器从基础服务描述继承
环境
配置。例如,将以下内容放入名为
base.yml
的文件中:

version: '2'

services:
  base:
    environment:
      DB_URL: https://db:8443
      DB_USER_NAME: admin
      DB_USER_PASSWORD: admin 
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
然后在您的
docker compose.yml中:

version: '2'

services:
  base:
    environment:
      DB_URL: https://db:8443
      DB_USER_NAME: admin
      DB_USER_PASSWORD: admin 
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
然后在
容器1的内部,您将看到:

DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin
DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin
ANOTHERVAR=this is a test
容器2的内部,您将看到:

DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin
DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin
ANOTHERVAR=this is a test
显然,除了
环境
指令之外,您还可以使用
扩展
;使用docker compose时,这是一种避免重复的好方法。

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

version: '2'

services:
  base:
    environment:
      DB_URL: https://db:8443
      DB_USER_NAME: admin
      DB_USER_PASSWORD: admin 
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
然后在您的
docker compose.yml中:

version: '2'

services:
  base:
    environment:
      DB_URL: https://db:8443
      DB_USER_NAME: admin
      DB_USER_PASSWORD: admin 
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
然后在
容器1的内部,您将看到:

DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin
DB_URL=https://db:8443
DB_USER_NAME=admin
DB_USER_PASSWORD=admin
ANOTHERVAR=this is a test
容器2的内部,您将看到:

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

显然,除了
环境
指令之外,您还可以使用
扩展
;使用docker compose时,这是一种避免重复的好方法。

扩展
选项可能很好,但它位于
3.x
compose文件中。其他方法包括:

  • (撰写文件3.4+)

    如果可以使用3.4+组合文件,扩展名字段可能是最佳选项:

    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}
    
     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'
    
     version: '3.2'
    
     services:
       some_service:
         image: someimage
         env_file:
           - 'variables.env'
    
       another_service:
         image: anotherimage
         env_file:
           - 'variables.env'
    
     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
    
     VARIABLE=some_value
     ANOTHER_VARIABLE=another_value
    
  • 项目根目录中的.env (或实际组合环境中的变量)

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

    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}
    
     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'
    
     version: '3.2'
    
     services:
       some_service:
         image: someimage
         env_file:
           - 'variables.env'
    
       another_service:
         image: anotherimage
         env_file:
           - 'variables.env'
    
     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
    
     VARIABLE=some_value
     ANOTHER_VARIABLE=another_value
    

  • extends
    选项可能很好,但它位于
    3.x
    组合文件中。其他方法包括:

  • (撰写文件3.4+)

    如果可以使用3.4+组合文件,扩展名字段可能是最佳选项:

    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}
    
     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'
    
     version: '3.2'
    
     services:
       some_service:
         image: someimage
         env_file:
           - 'variables.env'
    
       another_service:
         image: anotherimage
         env_file:
           - 'variables.env'
    
     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
    
     VARIABLE=some_value
     ANOTHER_VARIABLE=another_value
    
  • 项目根目录中的.env (或实际组合环境中的变量)

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

    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}
    
     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'
    
     version: '3.2'
    
     services:
       some_service:
         image: someimage
         env_file:
           - 'variables.env'
    
       another_service:
         image: anotherimage
         env_file:
           - 'variables.env'
    
     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
    
     VARIABLE=some_value
     ANOTHER_VARIABLE=another_value
    

  • extends
    适用于我的用例。它优于局部变量,因为它消除了对特定用户的依赖。使用
    extends
    可以做的另一件事是指定通用容器标签。我可以
    extends
    多个服务吗?或者每个服务有多个文件?对于从子目录调用内容时遇到FileNotFoundError的任何其他人,您可以使用文件的相对路径:“./base.yml”
    extends
    适用于我的用例。它优于局部变量,因为它消除了对特定用户的依赖。使用
    extends
    可以做的另一件事是指定通用容器标签。我可以
    extends
    多个服务吗?或者每个服务有多个文件?对于从子目录调用内容时遇到FileNotFoundError的任何其他人,您可以使用文件的相对路径:“./base.yml”我认为
    $USERNAME=“admin”PASSWORD=“admin”docker compose
    不好。黑客喜欢
    $history
    并使用历史记录获取密码cmd@ChangwooRhee如果您在本地使用docker compose的敏感凭据,您会遇到与技术无关的问题,我认为
    $USERNAME=“admin”PASSWORD=“admin”docker compose up
    不好。黑客喜欢
    $history
    并使用历史记录获取密码cmd@ChangwooRhee如果您在本地使用docker compose的敏感凭据,那么对于那些不太熟悉YAML的人来说,您会遇到与技术无关的问题:请参阅“合并密钥语言”在YAML中,关于表示法==>environment:@logicOnAbstractions的原因,我到扩展字段文档的链接就足够了,对于那些不太熟悉YAML的人,YAML特性将进行解释:请参阅“合并键语言”在YAML中,关于表示法==>environment:@logicOnAbstractions的原因,我到扩展字段文档的链接就足够了,这里解释了YAML特性