如何安全地 git clone/pip 将私有存储库安装到我的 docker 镜像中?

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 ...


Dav*_*her 8

这适用于 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)


Jos*_*der 5

尽管使用了现代 (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 的回答进行操作