.env.local
:
FOO=bar
我正在将.env.local
作为服务env_file
加载。如果FOO
缺失或为空,我仍然希望提供一个回退值:
services:
caddy:
env_file: [.env.local]
image: caddy
environment:
FOO: ${FOO:-baz}
无论如何,FOO
始终是baz
,即使据我所知应该是bar
:
$ docker compose config
name: myproject
services:
caddy:
environment:
FOO: baz
image: caddy
我知道environment
优先于env_file
,但我引用的是FOO
本身,所以我敢打赌它会工作。我错过了什么吗?
1条答案
按热度按时间g6ll5ycj1#
Docker Compose文件中的
environment
字段确实比env_file
字段具有更高的优先级。这意味着如果在两个地方都定义了环境变量,则将使用environment
字段中的值。在您的示例中,
FOO
变量在env_file
和environment
字段中定义。environment
字段中的FOO
变量被设置为${FOO:-baz}
,这意味着“如果设置了FOO
的值并且不为空,则使用该值,否则使用baz
”。我知道environment优先于env_file,但我引用的是FOO本身,所以我敢打赌它会工作。我错过了什么
您期望
environment
部分中的FOO
变量将从env_file
中定义的FOO
变量中获取值(如果存在),否则使用回退值baz
。然而,这不是Docker Compose的工作方式。
在Docker Compose处理
environment
字段时,它还没有处理env_file
字段,所以它不知道在那里定义的FOO
变量。因此,它将FOO
视为未设置,并使用回退值baz
。.env
文件是一个特例。Docker Compose会在处理Docker Compose文件的其余部分之前自动读取此文件(如果存在)。这就是在.env
中定义FOO
的原因。--env-file
选项也可以工作,因为它告诉Docker Compose在处理Docker Compose文件之前读取指定的文件,类似于它自动读取.env
的方式。如果要为在
env_file
中定义的环境变量使用回退值,则需要在.env
中定义该变量或使用--env-file
选项。