使用Docker环境variables作为凭据

最近我们正试图find一种通过环境variables向我们在容器中运行的基于Spring的应用程序注入凭证的正确方法。

确切的过程包括

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

通过这种方式,没有一个docker inspectdocker exec [container_id] env或bashdocker容器和运行env将看到这些环境variables,即。 我们用bootstrap脚本注入的是不透明的。

所以问题是:还有什么我们应该考虑这个解决scheme? 任何明显的毛刺?

我们对于docker工程师来说是相当新颖的,所以这个关于通过shell脚本注入环境variables的行为是不可见的,因为之后有没有解释为什么的文档? 我们还没有find一个好的文档,但只是发现它是这样工作的

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

提前致谢!

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

但是,我不认为你可以完全隐藏有权检查进程环境的人的环境variables。 在我看来,如果你发现应用程序进程的id(在容器内或从主机),你应该能够在/procfind它的环境。 不会显示为docker env ,但它仍然在某处。 此外,无论如何,任何这样的人都可能直接连接到您的保险柜。

这意味着,这不会使容器环境中出现subprocess的环境,但它并不能真正将其隐藏起来(已经可以访问主机和控制docker的人)。

不过,恭喜这个设置。 比图像中内置证书好得多。

有趣的发现。 我认为这是因为环境variables对于运行应用程序的shell会话是本地的。 请参阅https://help.ubuntu.com/community/EnvironmentVariables

过程局部性

环境variables的值是本地的,这意味着它们是特定于正在运行的进程或为其设置的。 这意味着,如果我们打开两个terminal窗口(这意味着我们有两个独立的bash进程正在运行),并且在其中一个窗口中更改了一个环境variables的值,那么这个更改将不会被其他窗口中的shell看到其他程序目前在桌面上。

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