将Docker环境变量用于凭据

时间:2016-04-06 23:52:46

标签: docker docker-compose dockerfile

最近,我们正在尝试找到一种通过环境变量将凭证注入到我们在容器中运行的基于spring的应用程序的正确方法。

具体过程包括

  • 一个bootstrap shell脚本,docker CMD作为入口点运行
  • 在脚本中导出一堆凭据
  • 在脚本文件末尾运行应用程序

通过这种方式,docker inspectdocker exec [container_id] env或bash到docker容器并运行env都不会看到这些环境变量,即。我们使用bootstrap脚本注入的内容是不透明的。

所以问题是:这个解决方案还有什么我们应该考虑的吗?任何明显的故障?

我们对docker世界很新,所以这个行为,关于使shell脚本注入的环境变量是不可见的,因为之后,是否有任何文件解释原因?我们还没有找到一个好的文档但只是发现它正在以这种方式工作

PS。 docker将来会改变这种行为吗?

提前致谢!

2 个答案:

答案 0 :(得分:4)

这看起来总体来说是一个非常好的方法。

但是,我认为你不能完全隐藏有权检查进程环境的人的环境变量。在我看来,如果您找到应用程序进程的进程ID(在容器内或从主机中),您应该能够在/proc中找到它的环境。不会显示为docker env,但它仍然存在于某个地方。 此外,任何此类人员都可以直接连接到您的保险柜。

意思是,是的,这将可靠地不会使子进程的环境出现在容器环境中,但它并没有真正隐藏任何人(他们已经可以访问您的主机和控制docker)。

仍然,恭喜这个设置。比将凭证内置到图像中要好得多。

答案 1 :(得分:0)

有趣的发现。我认为这是因为环境变量是运行应用程序的shell会话的本地变量。见https://help.ubuntu.com/community/EnvironmentVariables

  

处理地点

     

环境变量的值是本地的,这意味着它们是   特定于它们设置的运行过程。这个   意味着,如果我们打开两个终端窗口(这意味着我们有两个   单独的bash进程运行),并更改环境的值   其中一个窗口中的变量,该变化将不会被看到   shell在另一个窗口或当前的任何其他程序   桌面。

关于风险,这里有一个很好的讨论https://github.com/docker/docker/pull/9176#issuecomment-99542089。例如,您可能在打印或记录环境的同一会话中有调试应用程序,任何子进程也会看到环境变量。