docker构建期间的SSH代理转发

docker构建期间的SSH代理转发,docker,docker-compose,dockerfile,ssh-keys,docker-image,Docker,Docker Compose,Dockerfile,Ssh Keys,Docker Image,在通过dockerfile构建docker映像时,我必须克隆github repo。我已经将我的公共ssh密钥添加到我的git hub帐户,并且我能够从我的docker主机克隆repo。虽然我看到可以通过在docker运行时映射ssh\u AUTH\u SOCKenv变量来使用docker主机的ssh密钥,就像docker run--rm-it--name container\u name一样\ -v$(dirname$SSH\u AUTH\u SOCK):$(dirname$SSH\u AUT

在通过dockerfile构建docker映像时,我必须克隆github repo。我已经将我的公共ssh密钥添加到我的git hub帐户,并且我能够从我的docker主机克隆repo。虽然我看到可以通过在docker运行时映射
ssh\u AUTH\u SOCK
env变量来使用docker主机的ssh密钥,就像
docker run--rm-it--name container\u name一样\
-v$(dirname$SSH\u AUTH\u SOCK):$(dirname$SSH\u AUTH\u SOCK)\
-e SSH\u AUTH\u SOCK=$SSH\u AUTH\u SOCK my\u image


在docker构建期间如何执行相同操作?

不幸的是,您无法将ssh套接字转发到构建容器,因为docker当前不支持构建时卷装载

这是一个讨论了很久的话题,请参阅GitHub上的以下问题以供参考:

正如您所看到的,这个特性已经被多次请求用于不同的用例。到目前为止,维护人员对于解决这个问题一直犹豫不决,因为他们认为在构建过程中装载卷会破坏可移植性:

生成的结果应该独立于基础主机


如讨论中所述。

这可以使用替代构建脚本来解决。例如,您可以创建一个bash脚本并将其放入
~/usr/local/bin/docker compose
或您最喜欢的位置:

#!/bin/bash

trap 'kill $(jobs -p)' EXIT
socat TCP-LISTEN:56789,reuseaddr,fork UNIX-CLIENT:${SSH_AUTH_SOCK} &

/usr/bin/docker-compose $@
然后在Dockerfile中使用现有的ssh套接字:

...
ENV SSH_AUTH_SOCK /tmp/auth.sock
...
  && apk add --no-cache socat openssh \
  && /bin/sh -c "socat -v UNIX-LISTEN:${SSH_AUTH_SOCK},unlink-early,mode=777,fork TCP:172.22.1.11:56789 &> /dev/null &" \
  && bundle install \
...
or any other ssh commands will works
现在您可以调用我们的定制
docker compose build
。它将使用共享ssh套接字调用实际的docker脚本。

适用于docker 18.09及更高版本 您可以使用Docker的新功能将现有SSH代理连接或密钥转发给生成器。例如,这使您能够在构建期间克隆您的私有存储库

步骤:

首先设置环境变量以使用新的BuildKit

export DOCKER_BUILDKIT=1
然后使用新(实验性)语法创建Dockerfile:

并用

docker build --ssh default .

请在此处阅读更多信息:

这本书也很有趣:

它看起来像:

  • 在主机上
mkfifo myfifo
nc-lk 12345 myfifo
  • 在dockerfile中
运行mkfifo myfifo
在真实中奔跑;做\
nc 172.17.0.1 12345 myfifo\
完成&
运行导出SSH\u AUTH\u SOCK=/tmp/SSH-agent.SOCK
运行ssh。。。

那么您需要的是使用私钥来执行git clone?也许这不是对你问题的直接回答,但我认为可能会有所帮助。是否有可能在Docker Compose中使用此功能?我认为“mkdir-p-m 0600”应该是“mkdir-p-m 0700”,除非我遗漏了什么。
docker build --ssh default .
mkfifo myfifo
nc -lk 12345 <myfifo | nc -U $SSH_AUTH_SOCK >myfifo
RUN mkfifo myfifo
RUN while true; do \
  nc 172.17.0.1 12345 <myfifo | nc -Ul /tmp/ssh-agent.sock >myfifo \
done &

RUN export SSH_AUTH_SOCK=/tmp/ssh-agent.sock

RUN ssh ...