【问题标题】:SSH agent forwarding to Docker Alpine container from Mac OSSSH 代理从 Mac OS 转发到 Docker Alpine 容器
【发布时间】:2022-01-26 10:14:09
【问题描述】:

好的,所以对于几个项目,我需要访问我的私有存储库,所以我想将主机的 SSH 代理转发到容器,以允许从这些私有存储库中检索。最终我想在 docker-compose 中实现它。

我找到了很多指向这样的答案和解决方案:

docker run --rm -t -i \
-v $SSH_AUTH_SOCK:/ssh-agent \
-e SSH_AUTH_SOCK=/ssh-agent \
alpine:3.6 sh

但是当我在里面运行ssh-add -l 时(在确保安装了openssh 之后)

我收到以下错误:

连接代理时出错:连接被拒绝

还在我的 docker compose 设置中尝试过此操作,但它似乎无法正常工作。 由于大多数帖子和解决方案已有几年的历史,我希望有人可以帮助我提供准确的最新信息。

【问题讨论】:

    标签: docker docker-compose macos-sierra alpine ssh-agent


    【解决方案1】:

    根据this issue,您可以通过将-v /run/host-services/ssh-auth.sock:/run/host-services/ssh-auth.sock -e SSH_AUTH_SOCK="/run/host-services/ssh-auth.sock" 选项添加到您的docker run 命令,例如

    将您的macOS ssh-agent 转发到您的docker 容器
    docker run --rm -it \
    -v /run/host-services/ssh-auth.sock:/run/host-services/ssh-auth.sock \
    -e SSH_AUTH_SOCK="/run/host-services/ssh-auth.sock" \
    docker_image
    

    【讨论】:

    • 任何人都可以确认这适用于 macOS 吗?我试过了,它似乎不适合我。
    【解决方案2】:

    您可以挂载文件,但不能挂载套接字 - 目前还不支持通过管理程序在 MacOS 之间将套接字共享到 docker 容器中。存在各种错误报告和确认,总有一天它应该会起作用。

    因此,与此同时,您需要有一些东西可以在容器和 MacOS 之间转发网络流量。人们指出的解决方案之一是docker-ssh-agent-forward

    另一种解决方案是在容器中运行 ssh-agent 并从 MacOS 和其他容器中访问它——它可能更具侵入性但可以工作。解决方案是docker-ssh-agent

    【讨论】:

    • 另一个解决方案是使用 ngrok:ngrok.com 您可以使用 ngrok tcp 22 从容器内运行它,它会生成/公开一个公共 FQDN,您可以使用它直接连接到容器。
    【解决方案3】:
    1. 将密钥添加到已启动的托管 ssh-agent:
    SSH_AUTH_SOCK=`launchctl getenv SSH_AUTH_SOCK` ssh-add
    
    1. 将已启动的托管 ssh-agent 转发到 docker 容器:
    docker run --rm -it \
    -v /run/host-services/ssh-auth.sock:/run/host-services/ssh-auth.sock:ro \
    -e SSH_AUTH_SOCK="/run/host-services/ssh-auth.sock" \
    image ssh hosts
    

    容器中的挂载选项和SSH_AUTH_SOCK值都是魔术常量,不要更改。

    1. 由于buglaunchctl getenv SSH_AUTH_SOCK 可能会在 iTerm2 3.2+ 上输出空字符串。解决方法是以下之一:
    • 对于较新的操作系统(>=10.13,即 macOS High Sierra),portable waylaunchctl asuser $UID launchctl getenv SSH_AUTH_SOCK,或者
    • 对于较旧的操作系统,在 iTerm2 > 首选项 > 高级中,打开“启用多服务器守护程序”,或
    • 对于较旧的操作系统,在 iTerm2 > 首选项 > 高级中,关闭“允许会话在注销和重新登录后仍然存在”。

    注意:如果launchctl 问题无法解决,还有另一种方法可以通过stdio tunnel 转发ssh 代理。

    【讨论】:

    • 感谢您回答这个问题。您能否分享您的操作系统版本以及您在其上运行的 docker 软件和版本?
    • 操作系统:MacOS 11.0.1,Docker:20.10.0
    • 谢谢。这是 docker for mac 还是你用不同的虚拟机运行它?
    • Docker for Mac 3.0.0
    • 便携式解决方案非常适合我,无需摆弄 iTerm!很好的答案!
    猜你喜欢
    • 2021-07-27
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    相关资源
    最近更新 更多