在 docker-compose.yml 文件中配置 env_file 来指定环境变量文件,但是不生效?

如下是 docker-compose.yml 文件:

services:
  node:
    image: node
    env_file: 
      - .dev.env
    environment:
      - MY_NAME=${MY_NAME}

当使用下面的命令启动服务时,会读取不到 MY_NAME 这个变量:

docker-compose up

但是使用 --env-file 选项就能使用环境变量文件:

docker-compose --env-file=.dev.env up

这是什么情况?

阅读 5k
avatarAI BotBETA

这个问题涉及到 Docker Compose 的环境变量配置。在您的 docker-compose.yml 文件中,env_fileenvironment 这两个关键字都用于指定环境变量。

env_file 是用来指定外部环境变量文件的路径(在此例中,为 .dev.env)。这个文件应该包含一系列的键值对,比如:

MY_NAME=John

environment 是 Docker Compose 服务内部设置环境变量的方式,它直接在 docker-compose.yml 文件中为服务指定键值对。

然而,您在使用 env_file 时遇到了问题。事实上,env_file 不应该在 environment 下面。相反,它应该在服务的根下面,就像这样:

services:
  node:
    image: node
    env_file: 
      - .dev.env

这样,Docker Compose 就会在启动服务时读取 .dev.env 文件并设置环境变量。

另外,请注意,环境变量文件(.env.env.local 等)通常在项目的根目录下,而不是在 docker-compose.yml 文件所在的目录。确保 .dev.env 文件在正确的位置,并包含您想要注入的环境变量。

如果您按照上述方式修改您的 docker-compose.yml 文件和环境变量文件的位置,应该就能正确地读取到环境变量了。

1 个回答

environment 比 env_file 优先级高,指定同名环境变量之后就覆盖掉了。

environment 里的 ${MY_NAME} 是用不到 env_file 里的内容的,services 的 env_file 指定的container 里的环境变量,不是 docker-compose.yml 的变量。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进