与使用 Docker 的 WSL2 后端运行的 VS Code Devcontainer 共享 SSH 密钥



我正在阅读这些关于与开发容器共享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/

我也遇到了很多麻烦来实现这一点。以下步骤可能有助于故障排除:

  1. 检查ssh-agent是否在主机上运行并且密钥是否已添加

    在Windows上运行ssh-agent -l,并期望看到密钥的名称

  2. 检查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",
]

最新更新