git Docker 具有私钥的容器的权限被拒绝

git Permission denied on Docker container with private key

我创建了一个 Docker 容器,并通过包含此执行的 shell 脚本 运行 它:

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 \
        -w /home/$USER \
        $IMAGE_NAME \
        /bin/bash

因此,我认为既不存在权限问题,也不存在密钥存在问题。但是,如果我转到之前使用 ssh 克隆的 git 工作目录。我无法验证。

git pull -v
git@mygitlab.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

打印出 ssh -tv git@mygitlab.com 的输出我看到了这些差异: 没有 Docker 容器

...
debug1: Will attempt key: /home/xxx/.ssh/id_ed25519 ED25519 SHA256:20AHxx agent
debug1: Will attempt key: gitlab ED25519 SHA256:fEqoFK agent
debug1: SSH2_MSG_EXT_INFO received
....
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/xxx/.ssh/id_ed25519 ED25519 SHA256:20AHxx agent
debug1: Authentications that can continue: publickey
debug1: Offering public key: gitlab ED25519 SHA256:fEqoFK agent
debug1: Server accepts key: gitlab ED25519 SHA256:fEqoFK agent
debug1: Authentication succeeded (publickey).

在 Docker 容器中:

...
debug1: Will attempt key: /home/xxx/.ssh/id_ed25519 ED25519 SHA256:20AHxx
debug1: Will attempt key: /home/xxx/.ssh/id_xmss 
debug1: SSH2_MSG_EXT_INFO received
...
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /home/xxx/.ssh/id_rsa
debug1: Offering public key: /home/xxx/.ssh/id_ed25519 ED25519 SHA256:20AHxx
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/xxx/.ssh/id_xmss
debug1: No more authentication methods to try.
git@mygitlab.com: Permission denied (publickey).

我需要用 ssh-agent 做些什么吗?

这种特殊情况中,您可以通过添加 () 在 docker 实例中传递 SSH_AUTH_SOCK 环境变量:

-e SSH_AUTH_SOCK=$SSH_AUTH_SOCK 

在更一般的情况下,如果您在 Docker 实例中没有相同的 /tmp/home 挂载,这将不起作用,所以更一般地说,您可能必须有另一个 ssh 密钥,或者做一些更有趣的事情来传递代理通信 link。但在这里你 运行 在同一个网络 space 中,在同一个文件系统上,所以足以让你的内部“虚拟机”1 使用您的外部(真实)机器的 ssh 代理获取私钥。


1A Docker 实例更像是 FreeBSD 的“监狱”,而不是真正的 VM。然而,两者都提供了一种“穷人的虚拟机”。