【问题标题】:SSH agent forwarding during docker builddocker build 期间的 SSH 代理转发
【发布时间】:2017-09-11 02:32:47
【问题描述】:

在通过 dockerfile 构建 docker 映像时,我必须克隆一个 github 存储库。我将我的公共 ssh 密钥添加到我的 git hub 帐户中,并且我能够从我的 docker 主机克隆存储库。虽然我看到我可以通过在 docker run 时映射 $SSH_AUTH_SOCK env 变量来使用 docker 主机的 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 构建期间做同样的事情?

【问题讨论】:

标签: docker docker-compose dockerfile ssh-keys docker-image


【解决方案1】:

很遗憾,您无法将 ssh 套接字转发到构建容器,因为 Docker 目前不支持构建时卷挂载。

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

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

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

this 讨论中所述。

【讨论】:

    【解决方案2】:

    这可以使用替代构建脚本来解决。例如,您可以创建一个 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 脚本。

    【讨论】:

      【解决方案3】:

      适用于 Docker 18.09 及更高版本

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

      步骤:

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

      export DOCKER_BUILDKIT=1
      

      然后使用新的(实验性)语法创建 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
      

      并使用构建图像

      docker build --ssh default .
      

      在此处了解更多信息:https://medium.com/@tonistiigi/build-secrets-and-ssh-forwarding-in-docker-18-09-ae8161d066

      【讨论】:

      • 是否有可能在 Docker Compose 中使用 --mount=type=ssh 这个功能?
      • 我认为“mkdir -p -m 0600”应该是“mkdir -p -m 0700”,除非我遗漏了什么。
      【解决方案4】:

      这个也很有意思:

      看起来像:

      • 在主机上
      mkfifo myfifo
      nc -lk 12345 <myfifo | nc -U $SSH_AUTH_SOCK >myfifo
      
      • 在 dockerfile 中
      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 ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-30
        • 2021-07-27
        • 2012-08-20
        • 1970-01-01
        • 2015-07-09
        • 1970-01-01
        • 2020-05-07
        相关资源
        最近更新 更多