如何安全地将SSH密钥传递给Docker构build?

我想创build一个复制我们的生产服务器的开发者的Docker镜像。 这些服务器由Ansibleconfiguration。

我的想法是运行一个ansible-pull的适用于容器内的所有configuration。 问题是我需要使用SSH密钥来获取剧本,但我不想在Docker镜像上共享SSH密钥。

那么,有没有一种方法可以让SSH密钥在运行时没有运行时间呢?

很好的问题。 最简单的方法是在构buildAnsible之后删除SSH密钥 – 但由于Docker将图像存储为图层,所以有人仍然可以find带有密钥的旧图层。

如果你构build这个Dockerfile:

 FROM ubuntu COPY ansible-ssh-key.rsa /key.rsa RUN [ansible stuff] RUN rm /key.rsa 

最终的图像将具有所有Ansible状态,SSH密钥将会消失, 但是有人可以轻松地运行docker history来查看所有图像层,并且在删除密钥之前从中间层启动一个容器,然后获取密钥。

诀窍就是做这样的事情,然后用Jason Wilder的docker-squash工具来压缩最终的图像。 在压扁的图像中,中间层已经消失,没有办法获取已删除的密钥。

我会设置一些本地文件服务设施只在您的生成环境中可用。
例如,在您的生成主机上启动lighttpd,以便只将pem文件提供给本地客户端。

在你的Dockerfile中,在一次运行中添加/拉出/清除:

 RUN curl -sO http://build-host:8888/key.pem && ansible-pull -U myrepo && rm -rf key.pem 

在这种情况下,它应该在单层中完成,所以应该没有跟踪提交后留下的key.pem。

您可以在运行时将SSH密钥安装到容器中。

 docker run -v /path/to/ssh/key:/path/to/key/in/container image command 

这是通过使用这个回购, dockito / vault ,秘密存储在Docker镜像构build中使用的另一个解决scheme。

我创build了一个服务dockito / vaultUbuntu映像,将我的私钥连接到卷,并将其作为进程运行,

 docker run -it -v ~/.ssh:/vault/.ssh ubuntu /bin/bash -c "echo mysupersecret > /vault/.ssh/key" docker run -d -p 14242:3000 -v ~/.ssh:/vault/.ssh dockito/vault 

而且,这是我的Dockerfile

 FROM ubuntu:14.04 RUN apt-get update -y && \ apt-get install -y curl && \ curl -L $(ip route|awk '/default/{print $3}'):14242/ONVAULT > /usr/local /bin/ONVAULT && \ chmod +x /usr/local/bin/ONVAULT ENV REV_BREAK_CACHE=1 RUN ONVAULT echo ENV: && env && echo TOKEN ENV && echo $TOKEN RUN ONVAULT ls -lha ~/.ssh/ RUN ONVAULT cat ~/.ssh/key 

你可以使用高山Linux来减less最终的构build大小,并build立图像,

 docker build -f Dockerfile -t mohan08p/VaultTest . 

而且,你已经完成了。 你可以检查图像。 秘密没有存储在图像内部为空。

 docker run -it mohan08p/VaultTest ls /root/.ssh 

这是在构build时通过.ssh的好技术。 唯一的缺点是我需要保持额外的Vault服务运行。