Docker容器挂载本地SSH私钥访问GitLab提示publickey权限被拒如何解决
问题根因
从宿主机和容器的SSH认证日志差异可直接定位问题:
- 宿主机侧SSH认证时使用了
ssh-agent中缓存的名为gitlab的ED25519密钥完成认证,该密钥未存放在~/.ssh目录下的默认密钥路径(id_ed25519等默认命名文件)中,或对应默认路径的密钥本身无Gitlab访问权限 - 容器启动时未挂载宿主机的ssh-agent套接字,也未注入SSH_AUTH_SOCK环境变量,容器内的SSH客户端仅扫描~/.ssh下的默认命名密钥,无法获取到ssh-agent中缓存的有效密钥,因此认证失败
解决方案
有两种可行方案,可按需选择:
方案1:共享宿主机ssh-agent(推荐)
无需修改密钥配置,也无需重复输入私钥密码,安全性更高,仅需要在原有docker run命令中新增两个参数即可:
- 添加环境变量传递:
-e SSH_AUTH_SOCK=$SSH_AUTH_SOCK - 添加ssh-agent套接字挂载:
-v $SSH_AUTH_SOCK:$SSH_AUTH_SOCK
修改后的完整启动命令如下:
docker run --rm -it \ --user $(id -u):$(id -g) \ --network host \ -e USER=$USER \ -e HOME=$HOME \ -h $HOSTNAME \ -v /tmp:/tmp \ -v /home/$USER:/home/$USER \ -v ~/.ssh:/home/$USER/.ssh:ro \ -e USERNAME=$USERNAME \ -e SSH_AUTH_SOCK=$SSH_AUTH_SOCK \ -v $SSH_AUTH_SOCK:$SSH_AUTH_SOCK \ -w /home/$USER \ $IMAGE_NAME \ /bin/bash
启动后容器内的SSH客户端可直接调用宿主机ssh-agent中已缓存的所有密钥,认证效果和宿主机完全一致。
方案2:配置本地SSH指定密钥
如果不想共享ssh-agent,可直接修改宿主机~/.ssh/config文件,添加Gitlab站点的专属密钥配置:
Host mygitlab.com User git IdentityFile ~/.ssh/你的gitlab有效私钥文件名
修改后该配置会随~/.ssh目录挂载进容器,容器内SSH会自动使用指定的密钥完成认证,若私钥设置了密码,每次认证时需要手动输入密码。
内容的提问来源于stack exchange,提问作者ywiyogo
相关产品推荐
相关产品推荐

