我想为重现我们的生产服务器的开发人员创建一个Docker镜像。这些服务器由Ansible配置。
我的想法是运行ansible-pull
来应用容器内的所有配置。问题是我需要SSH密钥来提取剧本,但我不想在Docker镜像上共享SSH密钥。
那么,有一种方法可以在构建时使用SSH密钥,而无需在运行时使用它们吗?
答案 0 :(得分:2)
好问题。这样做的简单方法是在构建中的Ansible内容之后删除SSH密钥 - 但是因为Docker将图像存储为图层,所以有人仍然可以找到带有密钥的旧图层。
如果你构建这个Dockerfile:
FROM ubuntu
COPY ansible-ssh-key.rsa /key.rsa
RUN [ansible stuff]
RUN rm /key.rsa
最终图片将具有您的所有Ansible状态,并且SSH密钥将消失但有人可以轻松运行docker history
以查看所有图片图层,并从中启动容器删除密钥之前的中间层,然后抓住密钥。
诀窍是做这样的事情,然后使用Jason Wilder's docker-squash tool压缩最终图像。在压扁的图像中,中间层消失了,无法获取已删除的密钥。
答案 1 :(得分:2)
我设置了一些仅在您的构建环境中可用的本地文件服务工具 例如。在构建主机上启动lighttpd,仅向本地客户端提供pem文件。
在你的Dockerfile中,你可以在一次运行中添加/拉取/清理:
RUN curl -sO http://build-host:8888/key.pem && ansible-pull -U myrepo && rm -rf key.pem
在这种情况下,它应该在单个图层中完成,因此在图层提交后不应留下key.pem的痕迹。
答案 2 :(得分:0)
这是使用此repo dockito/vault的另一种解决方案, 在Docker镜像构建中使用的秘密商店。
我创建了一个服务 dockito / vault 和 Ubuntu 图像,其中我将我的私钥附加到卷并使用,
将其作为一个进程运行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
您可以使用alpine linux来减少最终构建大小,并将图像构建为,
docker build -f Dockerfile -t mohan08p/VaultTest .
而且,你已经完成了。您可以检查图像。秘密没有存储在图像中,因为它是空的。
docker run -it mohan08p/VaultTest ls /root/.ssh
这是在构建时传递.ssh的好方法。唯一的缺点是我需要保持额外的Vault服务运行。
答案 3 :(得分:-1)
您可以在运行时将SSH密钥挂载到Container中。
docker run -v /path/to/ssh/key:/path/to/key/in/container image command