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

Ata*_*rus 2 docker docker-compose

我会使用环境文件在 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:
        ...
Run Code Online (Sandbox Code Playgroud)

我的 dev.env 文件:

REGISTRY_NAME=registry
... other values
Run Code Online (Sandbox Code Playgroud)

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

docker-compose -f compose-file.yml up
Run Code Online (Sandbox Code Playgroud)

我收到消息:

WARNING: The REGISTRY_NAME variable is not set. Defaulting to a blank string.
Run Code Online (Sandbox Code Playgroud)

我尝试设置 env_file 而不使用自定义属性:

services:
    registry:
        image: sensor-registry
        env_file: dev.env
        container_name: ${REGISTRY_NAME}
Run Code Online (Sandbox Code Playgroud)

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

services:
    registry:
        image: sensor-registry
        environment:
            - REGISTRY_NAME: registry
        container_name: ${REGISTRY_NAME}
Run Code Online (Sandbox Code Playgroud)

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

cat dev.env > .env && docker-compose -f composefile.yml up
Run Code Online (Sandbox Code Playgroud)

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

谢谢

rij*_*jam 6

env_file键(与 环境键类似用于设置仅在容器内使用的环境变量。

\n\n

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

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

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

\n\n
env_file: dev.env\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

来自Compose 中的环境变量

\n\n
\n

您可以使用 \xe2\x80\x98env_file\xe2\x80\x99 选项将多个环境变量从外部文件传递到 service\xe2\x80\x99s 容器,就像使用 docker run --env-file=FILE 一样。 ..:

\n
\n\n

再往下:

\n\n
\n

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

\n
\n\n

后者可能有点令人困惑,但这意味着如果在.env文件中指定了 FOO 和 BAR,则可以在 docker-compose 文件中执行此操作:

\n\n
one-service:\n    environment:\n      - FRAMEWORK=${FOO}\n\n\nother-service:\n    image: bash:4\n    container_name: ${BAR}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

接下来,作为副作用,如果您在撰写文件中使用:

\n\n
env_file: .env\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

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

您指定如下:

\n\n

docker-compose.core.yml:

\n\n
services:\n    web:\n      image: nginx\n      volumes:\n        - ./nginx.conf:/etc/nginx/sites-availables/default\n      networks:\n        - backend\n      dns:\n        - 8.8.8.8\n        - 9.9.9.9\n      ports:\n        - 80:80\n        - 443:443\n
Run Code Online (Sandbox Code Playgroud)\n\n

docker-compose.dev.yml:

\n\n
services:\n    web:\n      container_name: dev_server\n      ports:\n        - 8080:80\n        - 8443:443\n
Run Code Online (Sandbox Code Playgroud)\n\n

docker-compose.test.yml:

\n\n
services:\n    web:\n      container_name: test_server\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后在开发上:

\n\n
$  docker-compose -f docker-compose.core.yml -f docker-compose.dev.yml up -d web\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试中:

\n\n
$  docker-compose -f docker-compose.core.yml -f docker-compose.test.yml up -d web\n
Run Code Online (Sandbox Code Playgroud)\n\n

该功能的文档位于Docker compose CLI 概述中

\n\n

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

\n\n

在开发上:

\n\n
COMPOSE_FILE=docker-compose.core.yml:docker-compose.dev.yml\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试中:

\n\n
COMPOSE_FILE=docker-compose.core.yml:docker-compose.test.yml\n
Run Code Online (Sandbox Code Playgroud)\n\n

COMPOSE_FILE的文档可以在Compose CLI 环境变量中找到

\n\n

希望能帮助到你。

\n