我想为复制我们的生产服务器的开发人员创建一个 Docker 映像。这些服务器由 Ansible 配置。
我的想法是运行一个ansible-pull以应用容器内的所有配置。问题是我需要 SSH 密钥来拉取剧本,但我不想在 Docker 映像上共享 SSH 密钥。
那么,有一种方法可以在构建时使用 SSH 密钥,而无需在运行时使用它们?
我想为复制我们的生产服务器的开发人员创建一个 Docker 映像。这些服务器由 Ansible 配置。
我的想法是运行一个ansible-pull以应用容器内的所有配置。问题是我需要 SSH 密钥来拉取剧本,但我不想在 Docker 映像上共享 SSH 密钥。
那么,有一种方法可以在构建时使用 SSH 密钥,而无需在运行时使用它们?
我会设置一些仅在您的构建环境中可用的本地文件服务设施。
例如,在您的构建主机上启动 lighttpd 以仅将您的 pem 文件提供给本地客户端。
并在您的 Dockerfile 中一次性运行添加/拉取/清理:
RUN curl -sO http://build-host:8888/key.pem && ansible-pull -U myrepo && rm -rf key.pem
在这种情况下,它应该在单层中完成,因此在层提交后应该没有 key.pem 的痕迹。
好问题。简单的方法是在构建中的 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 的 docker-squash 工具来压缩最终图像。在压扁的图像中,中间层消失了,无法获取已删除的键。
这是另一种解决方案,通过使用此 repo、dokito/vault、用于 Docker 映像构建的秘密存储。
我创建了一个服务dokito/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 .
而且,你完成了。您可以检查图像。Secrets 没有存储在图像中,因为它是空的。
docker run -it mohan08p/VaultTest ls /root/.ssh
这是在构建时传递 .ssh 的好方法。唯一的缺点是我需要保持额外的 Vault 服务运行。
您可以在运行时将 SSH 密钥挂载到容器中。
docker run -v /path/to/ssh/key:/path/to/key/in/container image command