我正在阅读这些关于与开发容器共享SSH密钥的文档,但我无法使其工作。
我的设置如下:
-
使用WSL2后端的带有Docker Desktop 4.2.0的Windows 10
-
运行Ubuntu 20.04 的WSL2发行版
-
在WSL2中,我运行
ssh-agent
,并且知道我的密钥:λ ssh-add -l 4096 SHA256:wDqVYQshQBCG/Sri/bsgjEaUFboQDUO/9FJqhFMncdk /home/taschan/.ssh/id_rsa (RSA)
医生说
如果您的本地SSH代理正在运行,扩展将自动转发
但如果我在devcontainer中执行ssh-add -l
,它将以Could not open a connection to your authentication agent.
进行响应;当然,启动一个(用eval "$(ssh-agent -s)"
(只启动一个不知道我的私钥的。
我错过了什么?
我遇到了基本相同的问题。使用WSL2和我的VSCode Devcontainer运行Windows 11不会显示任何ssh密钥(在容器内运行ssh-add -l
会显示一个空列表(,尽管我的主机上配置了使用ssh密钥的Git。
对我来说,我的机器上有3个单独的ssh-agent
实例:
- WSL2
- Git Bash
- Windows主机🠆这是VSCode正在转发到devcontainer的一个
我现有的ssh密钥是在Git-Bash中设置的(根据Github的说明(,所以运行ssh-add -l
只会在Git-Bush终端中显示我的ssh密钥,而不会在其他地方。
然而,正如前面的回答中所解释的,通过挖掘Devcontainer启动日志显示,VSCode只转发主机的ssh-agent
,而不查看WSL2或Git-Bash。
解决方案:我建议遵循下面的Microsoft文档页面。您需要启用一个";可选特征";在Windows中,然后在PowerShell中运行一些命令(以管理员身份(以激活ssh-agent
服务。通过此设置,ssh-agent
/ssh-add
命令也将从常规CMD终端工作。您可以将这些与常见的keygen命令等一起使用,以在主机上生成和添加新密钥(我只是ssh-add
'使用了Git Bash最初生成的相同密钥(。添加的密钥应立即被容器内的ssh-add -l
检测到。
https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement
共享凭据的另一种方法是在devcontain.json
中安装SSH目录以及主代码目录。像这样:
"mounts": [
"type=bind,source=${localWorkspaceFolder},target=/work",
"type=bind,source=/home/${localEnv:USER}/.ssh,target=/root/.ssh,readonly"
]
请注意,您也不需要workspaceMount
字段。
更多信息:
https://code.visualstudio.com/remote/advancedcontainers/add-local-file-mount
https://docs.docker.com/storage/bind-mounts/
我也遇到了很多麻烦来实现这一点。以下步骤可能有助于故障排除:
-
检查
ssh-agent
是否在主机上运行并且密钥是否已添加在Windows上运行
ssh-agent -l
,并期望看到密钥的名称 -
检查VSCode是否转发套接字
在启动日志中搜索
ssh-agent
。我收到信息ssh-agent: SSH_AUTH_SOCK in container (/tmp/vscode-ssh-auth-a56c4b60c939c778f2998dee2a6bbe12285db2ad.sock) forwarded to local host (\.pipeopenssh-ssh-agent).
因此,VSCode似乎直接在此处转发Windows SSH代理(而不是WSL中运行的SSH代理(。
我尝试了很多东西,但都没有成功。最后,在创建devcontainer之后,我记下容器名称,并使用docker-cp命令将id_rsa和id_rsa.pub密钥复制到容器内。
语法:
docker cp <sourcefile> container_id:/dir
复制私钥和公钥:
docker cp /root/.ssh/id_ed25519 eloquent_ritchie:/root/.ssh/
docker cp /root/.ssh/id_ed25519.pub eloquent_ritchie:/root/.ssh/
更改私钥的权限,以便您可以进行git操作
docker exec eloquent_ritchie chmod 600 /root/.ssh/id_ed25519
eloquent_ritchie
是样本容器名称。您的容器名称会有所不同。使用您的集装箱名称
然后我就可以在devcontainer中进行Git操作了。
如果再次重建容器,则需要再次将文件复制到devcontainer。
为了解决这个问题,我在devcontain.json
文件中添加了以下行:
"mounts": [
"type=bind,source=${localEnv:HOME}/.ssh,target=/root/.ssh,readonly",
]