Docker的12factorconfiguration方法
是否还有任何本地或普遍接受的方法来使用环境variables来控制Docker的行为,即以12因子的方式?
我所看到的唯一的语言不可知方法是用-evariables来污染docker run命令。 我见过的最可维护的解决scheme是使用cat和sed的组合来使用.env文件生成CLI参数: https ://twitter.com/DataKyle/status/422843345120296960
我们目前使用Vagrant for dev,一个CI / CD托pipe供应商进行testing和部署,另外还使用AWS Elastic Beanstalk作为分段和生产PAAS。 我们的应用程序有超过100个可configuration的参数,其中大部分被设置为默认值,但是每个环境仍然需要定制大约10-20个参数。 这似乎太hacky运行docker,像这样的命令行variables的巨大列表。
此外,它不允许您从docker主机(例如,CI提供程序的预安装的Redis或Postgres凭据)中获取variables,而无需进一步破解。
有没有解决这个我没有find? 或者这是Docker的缺失? 或者,这在哲学上反对Docker哲学?
Docker 0.10.0及更高版本(2014年4月8日)接受docker run --env-file <filename>
,它可以让.env
的运行环境提供.env
的文件。
此外,您可以让--volumes-from
进一步交互:– --volumes-from
可以从引用的容器中挂载所有卷,而--link
允许容器知道引用的容器的公开端口的详细信息。
虽然Docker运行引用目前有点弱,但您可以在CLI引用的运行部分以及容器链接引用中find所有的细节。
至于什么从容器开始。 通常我build议启动一个shell脚本,它设置默认的环境variables(沿着: ${ENV:=default_value}
),导出它们,然后exec
一个单一的可执行文件。 这个可执行文件可以是前台所需的应用程序,也可以是runit
或supervisord
类的init替代runit
。
我不build议在docker中运行sshd
,如果它不是系统的一部分(例如,gitlab的容器应该包含sshd,因为它提供了通过ssh的git repo访问)。 出于维护或debugging的目的,我推荐使用nsenter
。