在docker build期间转发SSH代理

Ana*_*and 15 ssh-keys docker dockerfile docker-compose docker-image

在通过dockerfile构建docker镜像时,我必须克隆一个github repo.我已将我的公共ssh密钥添加到我的git hub帐户,我可以从我的docker主机克隆repo.虽然我看到我可以通过$SSH_AUTH_SOCK在docker运行时映射env变量来使用docker host的ssh键docker run --rm -it --name container_name \ -v $(dirname $SSH_AUTH_SOCK):$(dirname $SSH_AUTH_SOCK) \ -e SSH_AUTH_SOCK=$SSH_AUTH_SOCK my_image.

在docker build中我怎么能这样做?

joz*_*ozo 15

适用于Docker 18.09及更高版本

您可以使用Docker的新功能将现有SSH代理连接或密钥转发到构建器.例如,这可以在构建期间克隆您的私有存储库.

脚步:

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

export DOCKER_BUILDKIT=1
Run Code Online (Sandbox Code Playgroud)

然后使用新的(实验性)语法创建Dockerfile:

# syntax=docker/dockerfile:experimental

FROM alpine

# install ssh client and git
RUN apk add --no-cache openssh-client git

# download public key for github.com
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# clone our private repository
RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject
Run Code Online (Sandbox Code Playgroud)

并用它构建图像

docker build --ssh default .
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多相关信息:https://medium.com/@tonistiigi/build-secrets-and-ssh-forwarding-in-docker-18-09-ae8161d066

  • 是否有可能在 Docker Compose 中使用此功能 `--mount=type=ssh` ? (6认同)
  • 我认为“mkdir -p -m 0600”应该是“mkdir -p -m 0700”,除非我遗漏了一些东西。 (2认同)

nar*_*eas 5

遗憾的是,您无法将ssh套接字转发到构建容器,因为Docker当前不支持构建时卷安装.

这已经讨论了很长一段时间了,请参阅GitHub上的以下问题以供参考:

如您所见,针对不同的用例已多次请求此功能.到目前为止,维护人员一直在犹豫是否要解决这个问题,因为他们认为在构建期间安装卷会破坏可移植性:

构建的结果应该独立于底层主机

讨论中所述.


小智 5

这可以使用替代构建脚本来解决。例如,您可以创建一个 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 $@
Run Code Online (Sandbox Code Playgroud)

然后在您的 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
Run Code Online (Sandbox Code Playgroud)

现在您可以调用我们的自定义docker-compose build. 它将使用共享 ssh 套接字调用实际的 docker 脚本。