我将使用环境文件在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不能使用变量替换。我怎么了?
谢谢
答案 0 :(得分:1)
env_file 键(对于 environment 键也是如此)用于设置仅在容器内部使用的环境变量。
对于打算在docker-compose.yml文件中内插的变量,它们必须以下列方式之一来自主机:
docker-compose up
时设置的环境变量(例如FOO=bar docker-compose up
)然后,当您在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:
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
中找到希望有帮助。