SSH代理从Mac OS转发到Docker Alpine容器

The*_*fNL 5 ssh-agent docker docker-compose alpine-linux macos-sierra

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

我发现很多答案和解决方案都指向以下内容:

docker run --rm -t -i \
-v $SSH_AUTH_SOCK:/ssh-agent \
-e SSH_AUTH_SOCK=/ssh-agent \
alpine:3.6 sh
Run Code Online (Sandbox Code Playgroud)

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

我收到以下错误:

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

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

Jam*_*Gao 8

  1. 将密钥添加到 launchd 管理的 ssh-agent 中:
SSH_AUTH_SOCK=`launchctl getenv SSH_AUTH_SOCK` ssh-add
Run Code Online (Sandbox Code Playgroud)
  1. 将 launchd 管理的 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
Run Code Online (Sandbox Code Playgroud)

容器中的挂载选项和 SSH_AUTH_SOCK 值都是魔术常量,请勿更改它们。

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

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


chr*_*ris 7

根据这个问题,您可以通过向-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
Run Code Online (Sandbox Code Playgroud)


cde*_*oot 5

您可以挂载文件,但不能挂载套接字-目前尚不支持通过虚拟机管理程序在MacOS之间将套接字共享到docker容器中。存在各种错误报告和确认,并且有一天应该可以运行。

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

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