当使用env_file时,在Docker Compose服务中提供回退?

nom7f22z  于 2023-06-21  发布在  Docker
关注(0)|答案(1)|浏览(158)

.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本身,所以我敢打赌它会工作。我错过了什么吗?

g6ll5ycj

g6ll5ycj1#

Docker Compose文件中的environment字段确实比env_file字段具有更高的优先级。这意味着如果在两个地方都定义了环境变量,则将使用environment字段中的值。
在您的示例中,FOO变量在env_fileenvironment字段中定义。
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选项。

相关问题