【问题标题】:No variable substituion in docker-compose filedocker-compose 文件中没有变量替换
【发布时间】:2018-07-16 09:47:51
【问题描述】:

我会使用环境文件在 docker compose 文件中设置一些变量,以选择要使用的环境:dev、qualif、prod,...但是变量替换无法按我的预期工作。这是我的 docker compose 文件的摘录:

version: '3.4'
x-propertyfile: &propertyfile dev.env

services:
    registry:
        image: sensor-registry
        env_file: *propertyfile
        container_name: ${REGISTRY_NAME}
        ...
    other-services:
        ...

还有我的 dev.env 文件:

REGISTRY_NAME=registry
... other values

但是当我启动我的 docker-services 时

docker-compose -f compose-file.yml up

我收到了消息:

WARNING: The REGISTRY_NAME variable is not set. Defaulting to a blank string.

我尝试设置没有自定义属性的 env_file :

services:
    registry:
        image: sensor-registry
        env_file: dev.env
        container_name: ${REGISTRY_NAME}

那行不通。同理,如果我直接设置我的变量:

services:
    registry:
        image: sensor-registry
        environment:
            - REGISTRY_NAME: registry
        container_name: ${REGISTRY_NAME}

但是,如果我使用默认的 env 文件 (.env),那就可以了。我可以通过以下方式启动我的服务:

cat dev.env > .env && docker-compose -f composefile.yml up

但我想了解为什么变量替换不适用于 env_file。我哪里错了?

谢谢

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    env_file 键(同样用于 environment 键)用于设置环境变量,仅在容器内使用。

    对于打算在 docker-compose.yml 文件中插入的变量,它们必须以下列方式之一来自主机:

    • 作为导出的环境变量
    • 作为调用docker-compose up时设置的环境变量(例如:FOO=bar docker-compose up
    • 作为在名为 .env 的特殊文件中指定的环境变量

    那么,当您在 docker-compose.yml 文件中使用时:

    env_file: dev.env
    

    dev.env 文件中定义的环境变量只能在容器内部使用,在 docker-compose.yml 文件中不可用。

    文档中的两个相关摘录是:

    来自Environment variables in Compose

    您可以使用“env_file”选项将多个环境变量从外部文件传递到服务的容器,就像使用 docker run --env-file=FILE ...:

    再往下:

    您可以在名为 .env 的环境文件中为 Compose 文件中引用或用于配置 Compose 的任何环境变量设置默认值

    后面可能会有点混乱,但是这意味着如果在.env文件中指定了FOO和BAR,你可以在docker-compose文件中做到这一点:

    one-service:
        environment:
          - FRAMEWORK=${FOO}
    
    
    other-service:
        image: bash:4
        container_name: ${BAR}
    

    并且在该文件中还有特殊的环境变量 (COMPOSE_*) 来配置 Docker-compose。

    然后,作为副作用,如果您在撰写文件中使用:

    env_file: .env
    

    同一组环境变量将在容器内和 docker-compose 文件中同样可用。

    您找到的配置多个环境的解决方案的替代方法是使用和合并(组合)多个撰写文件。

    为了说明这一点,这是一个半假设的示例,您可以在其中创建以下 docker compose 文件:

    • docker-compose.core.yml
    • docker-compose.dev.yml
    • docker-compose.test.yml

    您指定如下:

    docker-compose.core.yml:

    services:
        web:
          image: nginx
          volumes:
            - ./nginx.conf:/etc/nginx/sites-availables/default
          networks:
            - backend
          dns:
            - 8.8.8.8
            - 9.9.9.9
          ports:
            - 80:80
            - 443:443
    

    docker-compose.dev.yml:

    services:
        web:
          container_name: dev_server
          ports:
            - 8080:80
            - 8443:443
    

    docker-compose.test.yml:

    services:
        web:
          container_name: test_server
    

    然后在开发上:

    $  docker-compose -f docker-compose.core.yml -f docker-compose.dev.yml up -d web
    

    测试中:

    $  docker-compose -f docker-compose.core.yml -f docker-compose.test.yml up -d web
    

    该功能的文档位于Overview of Docker compose CLI

    如果您不想输入所有这些文件名,可以在主机上的特殊环境变量中设置它们:

    在开发中:

    COMPOSE_FILE=docker-compose.core.yml:docker-compose.dev.yml
    

    测试中:

    COMPOSE_FILE=docker-compose.core.yml:docker-compose.test.yml
    

    COMPOSE_FILE 的文档可在 Compose CLI environment variables

    中找到

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2020-02-29
      • 2020-04-11
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 2022-06-24
      相关资源
      最近更新 更多