Docker容器中的configurationpipe理

目前我有configuration文件存储在GitHub。 我有一个格式如下的单个json文件{ DEV: { key1 : val1, key2 : val2 }PROD: { key1 : val1, key2 : val2 } }

我的构build系统克隆git仓库,构build项目并创build一个Docker镜像,并存储在私有Dockerregistry中。 我有jar文件和configuration文件复制到Docker图像。 每当我启动一个容器,我注入一个环境variables(ENV = DEV / PROD),我的代码用它来根据环境读取configuration。

我在这里有几个问题:

  • 维护环境特定configuration的最佳方法是什么?

  • configuration文件可能包含敏感数据,如api密钥和秘密如何在构buildDocker映像时encryption和存储和解密?

  • 如果我想改变一些configuration,我需要触发构build,因为我的configuration文件放在Docker镜像中。 我可以将configuration文件放在Docker容器外作为一个卷,以便我可以replaceconfiguration文件并重新启动容器,以便代码读取更新的configuration? 如果我想放在Docker容器之外,我还可以使用任何集群pipe理工具进行容器编排/pipe理(Kubernetes / ECS)吗?
  • 在Docker容器中运行应用程序的方法是通过重新启动容器而不是构build新的Docker镜像并部署新容器来读取更新后的configuration文件?

  1. ENVvariables是好的。 如果你有非常复杂的系统,你可以让Consul和/或Vault来pipe理安全的configuration,但是如果你的系统很小,这个混乱是不值得的。
  2. 你可以将所有configurationencryption成哈希,并用密钥解密它只知道应用程序。
  3. 使用docker-compose。 它允许完美的机制 – 在这里实际请求的机制,例如docker-compose.yml

     version: "2" services: server: hostname: server container_name: server image: serverBla build: ./server env_file: - ./config/config.env 

文件./config/config.env是你的“dynamic”configuration。 您只需重新创build容器即可刷新应用程序中的值。 就我所知,docker-compose可以和你提到的任何东西(我不熟悉Kubernetes,但是我确定存在这样的东西,它是container的基础)。

我对大部分问题的回答是“Hashicorp的Vault”

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

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

这怎么符合你所问的?

  • 维护环境特定configuration的最佳方法是什么?

我会说Vault。 如果你愿意的话,你可以使用木偶与Hiera的文件或文件夹写出秘密,但这意味着秘密写入磁盘是不理想的。 TMK K8s存储未encryption的秘密,这也是不理想的。 我更喜欢这里的Vault。 每个环境都有自己的保险库集群,并有“特定于环境的configuration”。

  • configuration文件可能包含敏感数据,如api密钥和秘密如何在构buildDocker映像时encryption和存储和解密?

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

  • 如果我想改变一些configuration,我需要触发构build,因为我的configuration文件放在Docker镜像中。 我可以将configuration文件放在Docker容器外作为一个卷,以便我可以replaceconfiguration文件并重新启动容器,以便代码读取更新的configuration? 如果我想放在Docker容器之外,我还可以使用任何集群pipe理工具进行容器编排/pipe理(Kubernetes / ECS)吗?

对此的回答高度依赖于configuration所包含的内容。 如果是特定于代码版本,我强烈build议将它与代码绑定,以防止代码和configuration中的任何不匹配。

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

但是,如果你的心脏设置在文件上,你可以很容易地将它们从一个已知的卷装入已知的path,所有的调度系统(包括现在的Nomad)都允许使用已部署的容器进行卷安装。

  • 在Docker容器中运行应用程序的方法是通过重新启动容器而不是构build新的Docker镜像并部署新容器来读取更新后的configuration文件?

使用保险柜:如果你想在启动时只改变秘密, envconsul是你的朋友。

请参阅上面的我的意见在configuration值的运行时更改。

实际执行的tl; dr是创build一个“启动”脚本,它是您的容器的入口点。 启动脚本将从您select的任何pipe理系统(卷挂载,Vault,文件,无论)中检索秘密,并准备好供应用程序读取。

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

希望这可以帮助!

PS:我不为Hashicorp工作,但我喜欢他们使用容器的软件。 通过购买Hashicorp的不同软件,您可以从K8s获得很多单一解决scheme。 单个应用程序(Hashicorp)允许您挑选并混合所需解决scheme的各个部分,但也需要较高的维护开销。 K8s是一个非常沉重的locking,但大部分你可能想要的东西,而不需要学习任何东西。

祝你好运