好的,对于我需要访问我的私有存储库的几个项目,所以我想将主机的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设置中尝试了这个,但它似乎没有像它应该的那样工作。 由于大多数帖子和解决方案已有几年的历史,我希望有人能帮助我提供准确的最新信息。
答案 0 :(得分:5)
根据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
答案 1 :(得分:4)
您可以挂载文件,但不能挂载套接字 - 通过虚拟机管理程序在MacOS之间共享套接字到docker容器中是不支持的。存在各种错误报告和确认,有一天它应该有效。
因此,与此同时,您需要在容器和MacOS之间转发网络流量。人们指出的解决方案之一是docker-ssh-agent-forward。
一个不同的解决方案是在容器中运行ssh-agent并从MacOS和其他容器访问它 - 它可能更具侵略性但有效。解决方案是docker-ssh-agent。
答案 2 :(得分:1)
SSH_AUTH_SOCK=`launchctl getenv SSH_AUTH_SOCK` ssh-add
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
容器中的mount选项和SSH_AUTH_SOCK值都是魔术常量,请不要更改它们。
launchctl getenv SSH_AUTH_SOCK
可能由于bug在iTerm2 3.2+上输出空字符串。解决方法是在iTerm2>“偏好设置”>“高级”中以任何一种方式进行操作: