9

是否有任何本机或普遍接受的方法来使用环境变量来控制 Docker 行为,即以 12 因素的方式?

我见过的唯一与语言无关的方法是使用 -e 变量污染 docker run 命令。我见过的最可维护的解决方案是使用 cat 和 sed 的组合使用 .env 文件生成 CLI 参数:https ://twitter.com/DataKyle/status/422843345120296960

我们目前使用 Vagrant for dev,一个用于测试和部署的 CI/CD 托管提供商,以及 AWS Elastic Beanstalk 作为暂存和生产 PAAS。我们的应用程序有 100 多个可配置参数,其中大部分设置为默认值,但每个环境仍需要自定义其中的 10-20 个左右。用大量的命令行变量来运行 docker 似乎太 hacky 了。

此外,它不允许您从 docker 主机获取变量(例如 CI 提供者的预安装 Redis 或 Postgres 凭据),而无需进一步破解。

有没有我还没有找到的解决方案?或者这是 Docker 的缺失部分?或者这是否在某种程度上违背了 Docker 哲学?

4

1 回答 1

4

Docker 0.10.0 和更新版本(2014 年 4 月 8 日)接受docker run --env-file <filename>,它允许您使用 -like 文件提供 docker 的运行环境.env

此外,您可以让 docker 进一步交互:--volumes-from可以从引用的容器挂载所有卷,并--link让容器知道引用容器的暴露端口的详细信息。

虽然Docker 运行参考目前有点弱,但您可以在 CLI 参考的运行部分以及容器链接参考中找到所有详细信息。

至于从容器开始。通常我建议启动一个 shell 脚本,它设置默认环境变量(沿着: ${ENV:=default_value}),导出它们,然后exec是单个可执行文件。此可执行文件可以是前台所需的应用程序,也可以是 init 替代品,例如runitsupervisord.

如果它不是系统的一部分,我不建议sshd在您的 docker 中运行(例如,gitlab 的容器应该包含 sshd,因为它通过 ssh 提供 git repo 访问)。出于维护或调试目的,我建议nsenter改用。

于 2014-10-12T20:42:49.627 回答