gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:48:33 25 4
gpt4 key购买 nike

我会使用环境文件在 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}

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

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。我做错了什么?

谢谢

最佳答案

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 :

You can pass multiple environment variables from an external file through to a service’s containers with the ‘env_file’ option, just like with docker run --env-file=FILE ...:

再往下:

You can set default values for any environment variables referenced in the Compose file, or used to configure Compose, in an environment file named .env

后面的可能有点迷惑,但意思是如果在.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 中找到

希望对您有所帮助。

关于docker - docker-compose 文件中没有变量替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51358970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com