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



好的,对于几个项目,我需要访问我的私有仓库,所以我想将主机的 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 撰写设置中尝试过这个,但它似乎没有像它应该的那样工作。由于大多数帖子和解决方案都有几年的历史,我希望有人可以帮助我提供准确的最新信息。

根据此问题,您可以通过向 docker run 命令添加-v /run/host-services/ssh-auth.sock:/run/host-services/ssh-auth.sock -e SSH_AUTH_SOCK="/run/host-services/ssh-auth.sock"选项将 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
  1. 将密钥添加到启动的托管 ssh 代理:
SSH_AUTH_SOCK=`launchctl getenv SSH_AUTH_SOCK` ssh-add
  1. 将启动的托管 ssh 代理转发到 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. 由于该错误,launchctl getenv SSH_AUTH_SOCK可能会在 iTerm2 3.2+ 上输出空字符串。解决方法是以下方法之一:
  • 较新操作系统(>=10.13,即macOS High Sierra(的便携式方式是launchctl asuser $UID launchctl getenv SSH_AUTH_SOCK,或
  • 对于较旧的操作系统,在 iTerm2> Prefs> Advanced 中,打开"启用多服务器守护程序",或
  • 对于较旧的操作系统,在 iTerm2> Prefs> Advanced 中,关闭"允许会话在注销和重新登录后继续有效"。

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

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

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

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

最新更新