访问 docker-compose 文件中的 env 文件变量

tem*_* as 12 docker dockerfile docker-compose

我有一个环境文件,其中包含一个名为Database_User.

在我的 docker-compose 中,我有这个:

services:
  database:
    container_name: postgres
    hostname: db
    image: postgres:12-alpine
    environment:
      - POSTGRES_USER=${Database_User}
   ports:
      - "54321:5432"
   env_file: project/myproject/.env
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误:

未设置 Database_User 变量。默认为空白字符串。

acr*_*ran 29

environment为了做到这一点,正确理解和env_file属性与文件之间的差异非常重要.env

  • environmentenv_file让您指定要在容器中设置的环境变量:
    • 您可以在environment中显式指定变量docker-compose.yml
    • env_file隐式导入该文件中的所有变量
    • 将两者混合在同一个服务上是不好的做法,因为它很容易导致意外的行为
  • .env文件被加载到可以使用的 docker-compose 环境中docker-compose

因此,您当前的配置并没有达到您可能认为的效果:

env_file: project/myproject/.env
Run Code Online (Sandbox Code Playgroud)

将该文件加载到容器的.env环境中,而不是. 因此不会设置变量替换:docker-composeDatabase_User

environment:
  - POSTGRES_USER=${Database_User}
Run Code Online (Sandbox Code Playgroud)

这里的解决方案:env_file从您的文件中删除docker-compose.yml并放置.env在您开始的同一目录中docker-compose。或者,您可以使用标志通过路径指定.env--env-file文件:

docker-compose --env-file project/myproject/.env up
Run Code Online (Sandbox Code Playgroud)

  • 查看 [`docker-compose` 文档](https://docs.docker.com/compose/environment-variables/),它用小示例解释了所有这些。 (2认同)

ten*_*ive 3

编辑这个答案清楚地解释了在 env 文件中定义环境变量与在 docker-compose 文件中使用变量替换的重要区别。为了清楚起见,我编辑了我的答案,但请确保您也理解其他答案。

选项1

您可能尚未设置环境变量Database_User以使变量替换起作用,并且需要在运行 docker-compose 之前在定义的任何位置进行查找。

source ./database_user_defined_here.env
docker-compose up
Run Code Online (Sandbox Code Playgroud)

您可以查看有关环境变量替换的文档:https://docs.docker.com/compose/environment-variables/#substitute-environment-variables-in-compose-files

选项2

如果您使用环境文件,则不必指定该environment部分(然后只需POSTGRES_USER=...在该文件中定义)。然后你会运行:

docker-compose --env-file ./your-env-file.env up 
Run Code Online (Sandbox Code Playgroud)

或者您也可以在 docker-compose.yml 中指定 env 文件:

database:
  ...
  env_file:
    - your-env-file.env
Run Code Online (Sandbox Code Playgroud)

但是,您必须在此文件中显式指定环境变量。这些文档介绍了 env 文件语法。

  • 确保不要混淆 [`env_file` 配置选项](https://docs.docker.com/compose/environment-variables/#the-env_file-configuration-option) 和 [`--env_file` 标志](https://docs.docker.com/compose/environment-variables/#substitute-environment-variables-in-compose-files)因为他们正在做非常不同的事情!请参阅[我的答案](/sf/ask/4583899421/#65485273) (3认同)