git - 如何使用 Docker 中的部署 key 从 Github 部署代码?

标签 git docker ssh-agent

我想在构建时将代码从 Github 提取到我的 Docker 镜像中。我有一个从存储库生成的部署 key ,但在我看来 ssh-agent 不适用于我的 Docker 镜像。

我做了什么(我的 Dockerfile):

FROM python:2.7-stretch
ADD ./id_rsa /root/.ssh/id_rsa
RUN eval "$(ssh-agent -s)"
RUN ssh-add -K /root/.ssh/id_rsa

输出:

Step 12/22 : RUN eval "$(ssh-agent -s)"
 ---> Running in f9ad80981cee
Agent pid 6
Removing intermediate container f9ad80981cee
 ---> d773f7ce5917
Step 13/22 : RUN ssh-add -K /root/.ssh/id_rsa
 ---> Running in 95efeed6a7ad
Could not open a connection to your authentication agent.
The command '/bin/sh -c ssh-add -K /root/.ssh/id_rsa' returned a non-zero code: 2

如您所见,ssh-agent 已启动,但未在其中添加 key 。

如果我跳过 ssh-add 步骤,那么我的 git pull 稍后会因为特权而失败,这正如预期的那样失败,因为没有发生身份验证。

最佳答案

实际上,您不需要将私钥复制到容器中(最好不要这样做)。

您只需要在主机和 docker 容器上安装并启动 ssh-agent 然后您需要做的就是挂载 ssh-aget 的套接字文件:

如果您使用的是 docker-compose:

environment:
  - "SSH_AUTH_SOCK=/tmp/ssh-agent"
volumes:
  - $SSH_AUTH_SOCK:/tmp/ssh-agent

使用 docker:

docker run -v $SSH_AUTH_SOCK:/tmp/ssh-agent 8be57bbc9561 sleep 1000000 # 8be57bbc9561 is an id of the image
docker exec -it -e SSH_AUTH_SOCK=/tmp/ssh-agent 5b6f4a8f8661 /bin/ash # 5b6f4a8f8661 is an id of the container

附言

就你的情况而言,我认为问题可能与 export 命令有关,该命令通常是 evaled 来自 ssh- 输出的代码代理

它应该为您提供两个变量:SSH_AUTH_SOCKSSH_AGENT_PID。但 export 不会跨图像持续存在。

您已经使用了两次 RUN:第一次用于启动 ssh-agent 并导出变量,然后用于添加 key 。并且每个 Dockerfile 指令都会生成一个中间容器(并且导出不会在它们之间持续存在)。

如果您仍然想以这种方式使用它(我强烈建议避免使用它),您可以尝试在单个 RUN 中绑定(bind)这两个命令:

RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa

我写了一个 short post根据我上面的回答。

关于git - 如何使用 Docker 中的部署 key 从 Github 部署代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49803860/

相关文章:

linux - Docker 运行 - 用户组没有按预期工作?

linux - 请解释 Linux bash exec 和 ssh-agent 行为

git - 我如何克隆一个变得太大的 git 仓库?

image - 如何使用 ansible docker_image 模块标记本地 docker 镜像?

ruby-on-rails - 每次我运行docker-compose运行web时,都使用Docker多个容器

ssh - 将证书添加到 ssh-agent 以获取已在代理内部的 key

git - 如何仅获取远程 git 操作来触发 ssh-agent 的 ssh-add 事件?

php - 如何在 OpenShift 上作曲更新?

git - 如何配置系统通过 ssh 反向隧道/代理使用 git?

git - 我可以在接受 pull 请求之前实时预览 pull 请求的结果吗?