Docker容器中的配置管理

目前我有配置文件存储在
GitHub中.我有一个格式如下的json文件

{

    DEV:

          {key1:val1,key2:val2},

    PROD:

          {key1:val1,key2:val2}

}.

我的构建系统克隆git repo,构建项目并创建Docker镜像并存储在私有Docker注册表中.我将jar文件和配置文件复制到Docker镜像中.每当我旋转一个容器时,我都会注入一个环境变量(ENV = DEV / PROD),我的代码使用它来根据环境读取配置.

我在这里有几个问题:

>维护特定于环境的配置的最佳方法是什么?
>配置文件可能包含敏感数据,如api密钥和秘密,当我构建Docker镜像时,如何加密,存储和解密?
>如果我想更改某些配置,我需要触发构建,因为我的配置文件放在Docker镜像中.我可以将配置文件放在Docker容器之外作为卷,以便我可以替换配置文件并重新启动容器,以便代码读取更新的配置吗?如果我想放置在Docker容器之外,我还可以使用任何集群管理工具进行容器编排/管理(Kubernetes / ECS)吗?
>通过重新启动容器而不是构建新的docker镜像并部署新容器,使在Docker容器中运行的应用程序读取更新配置的方法是什么?

最佳答案 我对大多数问题的回答是
“Vault by Hashicorp”

您可以在您的环境中启动Vault群集,让容器连接到,并在启动和运行时从Vault检索机密.实现秘密检索的最简单的方法是在启动时将秘密读入容器并推入容器的ENV.

如果您更进一步,可以使用语言级别的Vault客户端库在应用程序运行时检索和刷新机密,从而无需重新启动容器以检索新机密.

这如何适应你的要求?

>维护特定于环境的配置的最佳方法是什么?

我会说Vault.如果需要,可以使用Puppet和Hiera将秘密写入文件或文件夹,但这意味着将秘密写入磁盘并不理想. TMK K8s存储未经加密的秘密,这也是不理想的.我更喜欢这里的保险柜.每个环境都有自己的Vault群集,并且有“特定于环境的配置”.

>配置文件可能包含敏感数据,如api密钥和
秘密我在构建Docker时如何加密,存储和解密
图片?

往上看.保险柜存储秘密加密的秘密.使用您的Vault令牌(如果需要,可以通过卷装入容器)访问密码并解密它们.然后,您可以在启动容器主进程之前将它们推送到ENV,或者进行更紧密的集成并使Vault成为应用程序逻辑的一部分.

>如果我想更改某些配置,我需要触发构建
因为我的配置文件放在Docker镜像中.我可以吗
将配置文件放在Docker容器外部作为卷,以便我可以
替换配置文件并重新启动容器,以便更新代码
CONFIGS?如果我想放在Docker容器之外,我还可以
使用任何集群管理工具进行容器
编排/管理(Kubernetes / ECS)?

答案很大程度上取决于配置包含的内容.如果它特定于代码修订版,我强烈建议将其与代码捆绑在一起,以防止代码和配置中的任何不匹配.

如果它实际上独立于代码(例如:调整值或秘密),我会将它们放入Vault中 – 为什么当它们存储在加密的秘密管理系统中时将它们放在文件中?

但是,如果您的心脏设置在文件上,您可以轻松地将它们从已知卷安装到已知路径,并且所有调度系统(包括Nomad现在)都允许使用已部署的容器进行卷安装.

>读取在Docker容器中运行的应用程序的方法是什么?
通过重新启动容器而不是构建来更新配置
一个新的docker镜像并部署一个新容器?

使用Vault:envconsul是您的朋友,如果您希望秘密仅在启动时更改.

请参阅上面的我对配置值的运行时更改的看法.

实际执行的tl; dr是创建一个’startup’脚本,它是容器的入口点.启动脚本将从您选择的任何管理系统(卷安装,Vault,文件等)中检索秘密,并准备好供您的应用程序读取.

启动脚本然后启动主应用程序的运行过程.

希望这可以帮助!

PS:我不为Hashicorp工作,但我喜欢他们用于处理容器的软件.通过购买Hashicorp的不同软件可以获得很多你可以从K8s获得的单一解决方案.单个应用程序(Hashicorp)允许您选择和混合所需的解决方案,但也需要更高的维护开销. K8s是一个相当沉重的锁定,但你可能想要的大部分事情都不需要学习任何东西.

祝好运

点赞