docker-compose .env 与 direnv .envrc

Posted

技术标签:

【中文标题】docker-compose .env 与 direnv .envrc【英文标题】:docker-compose .env vs direnv .envrc 【发布时间】:2018-06-01 10:49:49 【问题描述】:

我们已经使用direnv 来自动加载特定文件夹中的环境变量已经有一段时间了。而且从版本 3 开始,docker-compose 似乎是support .env files。

direnv 使用的.envrc 文件使用export

export NODE_ENV=development

使用与 docker-compose 相同的文件似乎不起作用,只有没有export 我才能得到变量的值。

NODE_ENV=development

关于如何将其统一到单个 .env.envrc 文件或 direnv 的替代方案中的任何想法?

【问题讨论】:

【参考方案1】:

这是基于this answer 的评论链的替代解决方案

direnv ships with a stdlib 可用于支持经典的 'dotenv' 设置

# myproject/.envrc
# dotenv <optionalPathToDotEnvFile>
dotenv
# myproject/.env
FOO=BAR

这在使用支持 dotenv 样式的容器系统(如 docker)时特别有用

【讨论】:

【参考方案2】:

我使用以下设置在开发期间从.envrc 获得变量,但使用docker-compose 文件进行部署:

./secrets 中定义你的变量,因为 docker-compose 需要它们(没有导出):

foo=bar
secret_var=secret
...

./envrc 中将它们导出到你的shell:

#!bash
set -a
. ./secrets
set +a

set -a 默认导出所有内容,set +a 之后将其关闭。

【讨论】:

另一种方法是使用.envrc 中的dotenv 函数。这是 direnv 标准库的一部分。 这方面的文档不多,所以请参考这里的讨论:github.com/direnv/direnv/issues/284#issuecomment-315275436 真的就像在.envrc 文件中包含dotenv 一样简单。 direnv 标准库可以在这里找到direnv.net/man/direnv-stdlib.1.html

以上是关于docker-compose .env 与 direnv .envrc的主要内容,如果未能解决你的问题,请参考以下文章

如何从.env文件获取环境变量到docker-compose.yml?

docker-compose 未定义的 process.env

可以将来自docker-compose.yml的env变量传递给dockerfile吗?

Docker-compose env文件不起作用

在 docker-compose 的 .env 文件中使用多行值

如何从env_file获取docker-compose的端口?