docker-compose文件中没有变量替换

时间:2018-07-16 09:47:51

标签: docker docker-compose

我将使用环境文件在docker组成文件中设置一些变量,以选择要使用的环境: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),则可以使用。我可以通过以下方式启动服务:

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

但是我想了解为什么env_file不能使用变量替换。我怎么了?

谢谢

1 个答案:

答案 0 :(得分: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

然后在dev上

$  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

中找到

希望有帮助。