如何使用Docker中的部署密钥从Github部署代码?

Har*_*h M 6 git ssh-agent docker

我想在构建时将代码从Github拉入我的Docker镜像.我有一个从存储库生成的部署密钥,但在我看来,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
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

如您所见,ssh-agent已启动,但密钥未添加.

如果我跳过SSH-添加步骤,然后我的git拉失败的,后来因为特权,它是如预期没有发生认证失败.

zin*_*yev 4

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

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

如果您正在使用docker-compose

environment:
  - "SSH_AUTH_SOCK=/tmp/ssh-agent"
volumes:
  - $SSH_AUTH_SOCK:/tmp/ssh-agent
Run Code Online (Sandbox Code Playgroud)

使用泊坞窗

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
Run Code Online (Sandbox Code Playgroud)

聚苯乙烯

就您的情况而言,我认为问题可能与export命令有关,该命令通常evaled来自ssh-agent.

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

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

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

RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

我根据上面的回答写了一篇简短的文章。