【问题标题】:docker buildkit mount ssh when using remote agent forwarding使用远程代理转发时 docker buildkit mount ssh
【发布时间】:2020-05-07 08:22:18
【问题描述】:

我使用--ssh docker buildkit 功能,它在本地运行良好。 我想在远程服务器上构建 Docker,为此我使用 -A 标志来转发我的本地 github 密钥,例如:

ssh -i "server.pem" -A <user>@<server-ip>

然后在服务器终端我运行:

ssh -T git@github.com

我收到“Hello user”消息,这意味着密钥转发工作正常。
(在服务器里确实设置了$SSH_AUTH_SOCK,我可以git clone

现在,在本地构建时,我使用:

DOCKER_BUILDKIT=1 docker build --ssh default=~/.ssh/id_rsa -t myimage:latest .

效果很好。
但是在服务器中,私钥在 ~/.ssh/id_rsa 中不存在。那么我怎样才能将它转发到 docker build 呢? 在服务器上试过这个:

DOCKER_BUILDKIT=1 docker build --ssh default=$SSH_AUTH_SOCK -t myimage:latest .

但它不起作用。错误是:

could not parse ssh: [default]: invalid empty ssh agent socket, make sure SSH_AUTH_SOCK is set

即使设置了SSH_AUTH_SOCK

Docker 版本:19.03

【问题讨论】:

    标签: docker ssh ssh-keys docker-build docker-buildkit


    【解决方案1】:

    您的问题是您指定了私钥的显式路径。 默认情况下,ssh 挂载支持将使用您的代理,但您已告知它不要这样做。试试吧:

    DOCKER_BUILDKIT=1 docker build --ssh default -t myimage:latest .
    

    我正在使用以下Dockerfile 进行测试:

    # syntax=docker/dockerfile:experimental
    
    FROM alpine
    RUN apk add --update git openssh
    RUN mkdir -m 700 /root/.ssh; \
            printf "Host *\nStrictHostkeyChecking no" > /root/.ssh/config; \
            chmod 600 /root/.ssh/config
    RUN --mount=type=ssh ssh git@github.com
    

    如图所示调用,这应该会显示来自ssh git@github.com 行的“成功”消息。

    【讨论】:

    • 这是我最初尝试的。我收到错误:could not parse ssh: [default]: invalid empty ssh agent socket, make sure SSH_AUTH_SOCK is set。即使设置了 $SSH_AUTH_SOCK。
    【解决方案2】:

    您需要在您的机器上运行ssh-agent,并在登录时使用ssh-add添加密钥或使用ssh -A -o AddKeysToAgent=true。如果您设置@987654326,SSH将不会自动转发-i指定的密钥@ 据我所知。登录后,您可以运行 ssh-add -L 以确保您的密钥已被转发,如果您在那里看到记录,那么 docker build --ssh default . 现在应该可以正常工作了。

    eval `ssh-agent`
    ssh-add server.pem
    ssh -A <user>@<server-ip>
    

    【讨论】:

    • 我要转发的密钥不是与-i 一起使用的密钥。我确实在客户端和服务器中都运行了 ssh-agent ssh-add 。在服务器中使用ssh-add -L 我确实看到了我的本地密钥
    • 我还要指定密钥必须命名为 id_rsa 或一些类似的默认密钥名称才能使其工作,并且在 Linux 下,您可能会遇到 AppArmor。有关更多详细信息,请参阅my answer here
    • 很好,我遇到了这个错误,因为 ssh 代理已关闭
    【解决方案3】:

    我遇到了类似的问题,并且很简单地解决了,我将 ${SSH_AUTH_SOCK} 包裹在花括号中

    eval $(ssh-agent)
    ssh-add ~/.ssh/id_rsa
    DOCKER_BUILDKIT=1 docker build -t myimage:latest --ssh default=${SSH_AUTH_SOCK} .
    

    在 Docker 文件中,我有适当的 RUN 指令来运行需要敏感数据的命令

    RUN --mount=type=ssh \
        mkdir vendor && composer install
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-11
      • 2021-11-26
      • 2023-01-04
      • 2022-01-07
      • 2017-09-11
      • 2015-12-30
      • 2012-08-20
      相关资源
      最近更新 更多