2014-09-23 32 views
20

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

我看过docker-squash可以将多个图层压缩到一个,从最终图像中删除任何已删除的文件。但是有没有更习惯的方法?

回答

4

关于习惯用法,我不确定,尽管码头人员仍然很年轻,有太多的成语。

但是,我们在我们公司有这个相同的问题。我们得出以下结论,尽管这是我们最好的努力,而不是建立在码头最佳实践。

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

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

+3

关于1,问题是,当将图像推送到索引(Docker hub,quay.io等)时,图像的所有图层都会被推入,包括具有属性文件的图层。任何抽取该图像的人都可以使用仍具有属性文件的图层来启动容器,并查看敏感变量。 – 2014-09-24 17:14:02

+0

好的 - 道歉。我以为你指的是共享一个构建文件(其他人可以构建并在构建时提供他们自己的属性文件)。 – 2014-09-25 08:21:44

+10

如果在单个'RUN'命令中下载某个文件,根据其内容执行任何您需要的操作并最终删除该文件,则下载的文件将不会被提交到一个图层中。它必须在一个“RUN”命令中 – Thomasleveil 2014-09-27 00:45:14

0

我们解决这个问题的方法是我们有一个写在docker build之上的工具。一旦您使用该工具启动构建,它将下载dockerfile并更改它。它改变需要“秘密”要像所有的指令:

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

然而,这留下提供给任何人的秘密数据和访问图像,除非该层本身具有像搬运工,壁球工具取出。用于生成每个中间层的命令可以使用the history command

0

Matthew Close在this blog article中对此进行了说明。

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

+0

看起来你发布的链接不起作用。 – 2017-06-29 22:13:30

+0

@BenWhaley修复。谢谢你让我知道。 – Xaser 2017-06-29 22:18:26

相关问题