Jes*_*cia 12 git ssh-keys docker-image
我有一个包含我想要 pip 安装的包的私有仓库。我花了很多时间阅读各种论坛和文章,了解如何安全地做到这一点。似乎没有就如何最好地做到这一点达成共识(如果可能的话)。我显然不想在我的 dockerfile 中公开任何 ssh 密钥/秘密——我想小心通过 docker 历史记录使它们可用。
Von*_*onC 16
如“从私有 git 存储库安全构建小型 python docker 镜像”中所述,您需要使用 Docker 18.09+
--ssh
您可以使用该--ssh标志将现有的 SSH 代理密钥转发给构建器。docker 不会传输关键数据,而只会通知构建器此类功能可用。
现在,当构建器需要通过 SSH 访问远程服务器时,它将回拨给客户端并要求它签署此连接所需的特定请求。
密钥本身永远不会离开客户端,一旦请求访问的命令完成,构建器端就没有信息可以稍后重新建立该远程连接。Secrets:
在构建期间提供挂载选项,/var/run/secrets仅适用于使用它的命令,不包含在创建的层中。
那是:
docker build --ssh github_ssh_key=/path/to/.ssh/git_ssh_id_rsa .
Run Code Online (Sandbox Code Playgroud)
只有代理连接与该命令共享,而不是私钥的实际内容。
Dockerfile 中的其他命令/步骤将无法访问它。
在多阶段的第一步中,Dockerfile 会给出一个键名,github_ssh_key以便我们在调用时可以使用它docker build:
RUN --mount=type=ssh,id=github_ssh_key pip wheel \
--no-cache \
--requirement requirements.txt \
--wheel-dir=/app/wheels
Run Code Online (Sandbox Code Playgroud)
该OP耶稣加西亚做报告(在评论),使其工作:
我不得不使用 2 个单独的
RUN命令。我不确定这是这个新功能的限制,还是我试图将多个命令串在一起的方式,
RUN但当我将它添加为other commands && /bin/sh -c "mount=type=ssh,id=github_ssh_key pip install private-repo"vs时,我一直收到一个公钥权限被拒绝错误RUN --mount=type=ssh,id=github_ssh_key pip install private-repo && more commands ...
这适用于 docker 19.03.5(但应该适用于 18.09+):
假设您的私有仓库在 Github 上,github.com/user/repo.git并且您希望将pip install其作为 docker 构建的一部分。存储库的 ssh 密钥位于主机上~/.ssh/my_key。
在 Dockerfile 中:
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
RUN --mount=type=ssh pip install git+ssh://git@github.com/user/repo.git
Run Code Online (Sandbox Code Playgroud)
然后,在主机上:
export DOCKER_BUILDKIT=1
eval `ssh-agent`
ssh-add ~/.ssh/my_key
docker build --ssh default=$SSH_AUTH_SOCK .
Run Code Online (Sandbox Code Playgroud)
尽管使用了现代 (19.03.8) Docker,但在DOCKER_BUILDKIT=1没有我在Alexandra Ulsh 的博客文章中找到的额外行的情况下,上述两种解决方案都对我不起作用(即使在prepending 之后),我认为这足够重要,值得一个额外的答案而不是被埋没在评论中。
尽管该
--secret标志出现在 Docker 的生产版本中,但有一些提示表明支持仍处于试验阶段。例如,使用构建机密的 Dockerfile 的第一行必须是
# syntax = docker/dockerfile:1.0-experimental. 没有这一行,你会得到错误failed to create LLB definition: Dockerfile parse error line 6: Unknown flag: mount。这一行使Docker CLI 能够使用Moby BuildKit的“实验性 Dockerfile 前端”。
TL;DR# syntax = docker/dockerfile:1.0-experimental在 Dockerfile 的顶部添加注释,然后按照Dave Rejkher 的回答进行操作。