如何在构buildDocker镜像时习惯性地访问敏感数据?

有时在构buildDocker映像时需要使用敏感数据。 例如,用于下载远程文件或从私有存储库安装依赖项的API令牌或SSH密钥。 分发产生的图像并省略用于构build它的敏感凭据可能是可取的。 如何才能做到这一点?

我已经看到了docker – 壁球可以压缩到一个多层,从最终的形象删除任何删除的文件。 但是有没有更习惯的方法?

关于惯用的方法,我不确定,虽然docker还是很年轻,有太多的成语。

然而,我们公司也有同样的问题。 我们得出以下结论,虽然这是我们最好的努力,而不是build立在docker最佳实践。

1)如果您需要构build时的值:在构build上下文中提供一个属性文件,其值可以在构build时读取,然后可以在构build之后删除属性文件。 这不是可移植的,但会完成这项工作。

2)如果在运行时需要这些值:将值作为环境variables传递。 对于有机会访问ps的人来说,他们是可见的,但这可以通过SELinux或其他方法来限制(老实说,我不知道这个过程,我是一个开发人员,运营团队将会处理这个部分)。

我们解决这个问题的方式是我们有一个写在docker build之上的工具。 一旦你使用这个工具开始构build,它将下载一个dockerfile并修改它。 它将所有需要“秘密”的指令改为:

 RUN printf "secret: asd123poi54mnb" > /somewhere && tool-which-uses-the-secret run && rm /somewhere 

不过,除非使用像docker-squash这样的工具去除图层本身,否则这将秘密数据提供给访问该图像的任何人。 用于生成每个中间层的命令可以使用history命令find

Matthew Close在这篇博客文章中谈到了这一点 。

总结:您应该使用docker-compose将敏感信息安装到容器中。