我想使用ssh-agent将我的密钥转发到docker镜像并从私有github仓库中提取。
我在Yosemite上使用了https://github.com/phusion/passenger-docker的略微修改版本和boot2docker。
ssh-add -l
...key details
boot2docker up
然后我使用我在很多地方看到的命令(即https://gist.github.com/d11wtq/8699521):
docker run --rm -t -i -v $SSH_AUTH_SOCK:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent my_image /bin/bash
但它似乎不起作用:
root@299212f6fee3:/# ssh-add -l
Could not open a connection to your authentication agent.
root@299212f6fee3:/# eval `ssh-agent -s`
Agent pid 19
root@299212f6fee3:/# ssh-add -l
The agent has no identities.
root@299212f6fee3:/# ssh git@github.com
Warning: Permanently added the RSA host key for IP address '192.30.252.128' to the list of known hosts.
Permission denied (publickey).
答案 0 :(得分:5)
单行:
以下是如何在运行Debian Jessie图像的Ubuntu 16上进行设置:
SELECT *
FROM
(
SELECT TRUNC(sysdate,'MM') + (level - 1) ,
level AS lvl ,
mod(level,:turnus) filter
FROM dual
CONNECT BY level <= last_day(sysdate) + 1 - TRUNC(sysdate,'MM')
ORDER BY level
)
WHERE filter = 0;
https://techtip.tech.blog/2016/12/04/using-ssh-agent-forwarding-with-a-docker-container/
答案 1 :(得分:4)
我扩展了@ wilwilson的答案,并创建了一个脚本,用于在OSX boot2docker环境中设置代理转发。
https://gist.github.com/rcoup/53e8dee9f5ea27a51855
#!/bin/bash
# Use a unique ssh socket name per-invocation of this script
SSH_SOCK=boot2docker.$$.ssh.socket
# ssh into boot2docker with agent forwarding
ssh -i ~/.ssh/id_boot2docker \
-o StrictHostKeyChecking=no \
-o IdentitiesOnly=yes \
-o UserKnownHostsFile=/dev/null \
-o LogLevel=quiet \
-p 2022 docker@localhost \
-A -M -S $SSH_SOCK -f -n \
tail -f /dev/null
# get the agent socket path from the boot2docker vm
B2D_AGENT_SOCK=$(ssh -S $SSH_SOCK docker@localhost echo \$SSH_AUTH_SOCK)
# mount the socket (from the boot2docker vm) onto the docker container
# and set the ssh agent environment variable so ssh tools pick it up
docker run \
-v $B2D_AGENT_SOCK:/ssh-agent \
-e "SSH_AUTH_SOCK=/ssh-agent" \
"$@"
# we're done; kill off the boot2docker ssh agent
ssh -S $SSH_SOCK -O exit docker@localhost
将其粘贴在~/bin/docker-run-ssh
,chmod +x
中,然后使用docker-run-ssh
代替docker run
。
答案 2 :(得分:4)
从2.2.0.0
版开始,用于macOS的docker允许用户访问容器内主机的SSH代理。
下面是一个示例命令,让您执行以下操作:
docker run --rm -it \
-v /run/host-services/ssh-auth.sock:/ssh-agent \
-e SSH_AUTH_SOCK="/ssh-agent" \
my_image
请注意,您必须像在Linux主机上那样安装特定路径(/run/host-services/ssh-auth.sock
)而不是$SSH_AUTH_SOCK
环境变量中包含的路径。
答案 3 :(得分:1)
我访问ssh-agent以转发在OSX Mavericks和docker 1.5上运行的密钥如下:
使用boot2docker ssh -A
ssh进入boot2docker VM。不要忘记使用选项-A,它可以转发身份验证代理连接。
在boot2docker ssh会话中:
docker@boot2docker:~$ echo $SSH_AUTH_SOCK
/tmp/ssh-BRLb99Y69U/agent.7750
此会话必须保持打开状态。记下SSH_AUTH_SOCK环境变量的值。
在另一个OS X终端中,使用步骤2中的SSH_AUTH_SOCK值发出docker run命令,如下所示:
docker run --rm -t -i \
-v /tmp/ssh-BRLb99Y69U/agent.7750:/ssh-agent \
-e SSH_AUTH_SOCK=/ssh-agent my_image /bin/bash
root@600d0e9b443d:/# ssh-add -l
2048 6c:8e:82:08:74:33:78:61:f9:9a:74:1b:65:46:be:eb
/Users/dev/.ssh/id_rsa (RSA)
我真的不喜欢这样一个事实:我必须保持boot2docker ssh会话打开以使其工作,但是直到找到更好的解决方案,这至少对我有用。
答案 4 :(得分:1)
我遇到了类似的问题,并且通过在主模式下使用ssh和控制套接字并将其全部包装在这样的脚本中,能够使事情变得非常无缝:
#!/bin/sh
ssh -i ~/.vagrant.d/insecure_private_key -p 2222 -A -M -S ssh.socket -f docker@127.0.0.1 tail -f /dev/null
HOST_SSH_AUTH_SOCK=$(ssh -S ssh.socket docker@127.0.0.1 env | grep "SSH_AUTH_SOCK" | cut -f 2 -d =)
docker run -v $HOST_SSH_AUTH_SOCK:/ssh-agent \
-e "SSH_AUTH_SOCK=/ssh-agent" \
-t hello-world "$@"
ssh -S ssh.socket -O exit docker@127.0.0.1
不是宇宙中最漂亮的东西,但比手动保持SSH会话打开IMO要好得多。
答案 5 :(得分:0)
套接字转发在OS X上尚不可用。这是使用 Docker for Mac 而不是现在已经过时的 boot2docker 引入到2019年的@henrjk答案的一种变体。
首先在容器中运行ssh服务器,/ tmp在可导出卷上。像这样
docker run -v tmp:/tmp -v \
${HOME}/.ssh/id_rsa.pub:/root/.ssh/authorized_keys:ro \
-d -p 2222:22 arvindr226/alpine-ssh
然后通过代理程序转发到该容器中
ssh -A -p 2222 root@localhost
在该ssh会话中查找ssh-agent的当前套接字
3f53fa1f5452:~# echo $SSH_AUTH_SOCK
/tmp/ssh-9zjJcSa3DM/agent.7
现在您可以运行您的真实容器了。只需确保将下面的SSH_AUTH_SOCK的值替换为您在上面的步骤中获得的值
docker run -it -v tmp:/tmp \
-e SSH_AUTH_SOCK=/tmp/ssh-9zjJcSa3DM/agent.7 \
vladistan/ansible
答案 6 :(得分:0)
无法打开与身份验证代理的连接。
此错误occurs when $SSH_AUTH_SOCK
env var在主机上设置不正确或根本没有设置。您可以尝试多种解决方法。我的建议是dual-boot Linux and macOS。
其他资源:
答案 7 :(得分:-1)
默认情况下,boot2docker仅共享/Users
下的文件。 SSH_AUTH_SOCK
可能位于/tmp
之下,因此-v
会安装虚拟机的代理,而不是来自您的虚拟机的代理。
如果您设置VirtualBox以共享/tmp
,它应该正常工作。