【问题标题】:Access env file variables in docker-compose file在 docker-compose 文件中访问 env 文件变量
【发布时间】:2020-12-28 21:24:45
【问题描述】:

我有一个环境文件,其中包含一个名为 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

但是,我收到一个错误:

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

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    要做到这一点,正确理解environmentenv_file 属性与.env 文件之间的区别很重要:

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

    因此,您当前的配置并没有像您认为的那样:

    env_file: project/myproject/.env
    

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

    environment:
      - POSTGRES_USER=${Database_User}
    

    这里的解决方案:从您的docker-compose.yml 中删除env_file,并将.env 放在您启动docker-compose 的同一目录中。或者你也可以specify an .env file by path with the --env-file flag:

    docker-compose --env-file project/myproject/.env up
    

    【讨论】:

    • 您好,您是说docker-compose 自动加载变量,那么我如何在environment: 中使用?
    • 看看docker-compose documentation,它用小例子解释了这一切。
    【解决方案2】:

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

    选项 1

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

    source ./database_user_defined_here.env
    docker-compose up
    

    您可以查看有关环境变量替换的文档: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 
    

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

    database:
      ...
      env_file:
        - your-env-file.env
    

    但是,您必须在此文件中明确指定环境变量。 These docs 复习 env 文件语法。

    【讨论】:

    • 请务必不要混淆env_file configuration option--env_file flag,因为它们做的事情截然不同!见my answer
    • 感谢您的澄清,您在回答中更好地解释了差异!
    • 我仍然不知道如何在 docker-compose 文件中使用变量。我有.env 文件
    • 我不确定您是否理解所提供的答案,抱歉。您是在谈论在撰写文件中使用任意变量,例如Database_User?如果您在.env 文件中定义了Database_User,则可以在运行docker-compose up 之前运行source your.env 来设置这些变量,如选项1 中所述。但是,请确保在这种情况下不要使用env_file 属性因为正如@acran 所说,混合这些很容易导致意外行为。
    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 2020-11-07
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多