Windows 10下VSCode+WSL2+Docker环境Git+SSH密钥配置问题求助
解决Docker容器内Git+SSH密钥权限与代理转发问题
我之前在WSL2+Docker环境里也碰到过一模一样的问题,折腾了好几天才搞定,给你几个亲测有效的方案:
方案一:修复容器内.ssh目录的权限问题
问题根源很明确:WSL里你的用户UID是1000,映射到容器的/root/.ssh后,目录和文件的所有者变成了1000:1000,但SSH要求这些文件必须属于当前用户(容器里是root,UID=0),且权限严格是目录700、文件600。
你可以在Docker Compose里通过entrypoint来自动修正权限,不用手动操作:
services: your-app-service: volumes: - ~/.ssh:/root/.ssh # 替换下面的"npm start"为你容器原本的启动命令 entrypoint: ["sh", "-c", "chown -R root:root /root/.ssh && chmod 700 /root/.ssh && chmod 600 /root/.ssh/* && exec npm start"]
这个命令会在启动容器应用之前,先把/root/.ssh的所有者改成root,同时修正权限,完全符合SSH的要求。
如果觉得每次启动都执行chown麻烦,也可以在WSL里复制一份密钥专门给容器用:
# 在WSL终端执行 sudo cp ~/.ssh/id_rsa /tmp/container_ssh_key sudo chown root:root /tmp/container_ssh_key sudo chmod 600 /tmp/container_ssh_key
然后在docker-compose.yml里只映射这个文件:
volumes: - /tmp/container_ssh_key:/root/.ssh/id_rsa
方案二:用SSH代理转发绕过权限问题(推荐)
挂载整个.ssh目录容易踩权限坑,更简洁的方法是让容器直接用WSL里的ssh-agent,这样根本不需要挂载密钥文件。之前你遇到GitHub权限拒绝,大概率是代理转发的配置没做全:
- 先确保WSL里的ssh-agent在运行,并且加载了你的密钥:
# 在WSL终端执行 eval $(ssh-agent -s) ssh-add ~/.ssh/id_rsa # 测试是否能连接GitHub ssh -T git@github.com
如果这里能成功,说明WSL的代理没问题。
- 在Docker Compose里挂载SSH_AUTH_SOCK,并设置环境变量:
services: your-app-service: environment: - SSH_AUTH_SOCK=/ssh-agent volumes: - ${SSH_AUTH_SOCK}:/ssh-agent
这样容器里的Git会自动使用WSL的ssh-agent来处理密钥,完全避开权限问题。
如果还是提示权限拒绝,检查容器里的ssh配置:
# 进入容器终端执行 echo "ForwardAgent yes" >> /etc/ssh/ssh_config
或者在执行Git命令时临时指定:
GIT_SSH_COMMAND="ssh -o ForwardAgent=yes" git clone git@github.com:your-repo.git
方案三:Docker Secrets(适合生产/CI场景)
如果是在生产环境或者CI/CD流水线里,不建议直接挂载本地密钥,用Docker Secrets更安全:
services: your-app-service: environment: - GIT_SSH_COMMAND="ssh -i /run/secrets/ssh_key -o StrictHostKeyChecking=no" secrets: - ssh_key secrets: ssh_key: file: ~/.ssh/id_rsa
Docker会自动把密钥挂载到/run/secrets/ssh_key,权限自动设为600,所有者是root,完美符合SSH要求。
内容的提问来源于stack exchange,提问作者Matt Woodward




