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。然而,两者都提供了一种“穷人的虚拟机”。
我创建了一个 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 做些什么吗?
在这种特殊情况中,您可以通过添加 (SSH_AUTH_SOCK
环境变量:
-e SSH_AUTH_SOCK=$SSH_AUTH_SOCK
在更一般的情况下,如果您在 Docker 实例中没有相同的 /tmp
和 /home
挂载,这将不起作用,所以更一般地说,您可能必须有另一个 ssh 密钥,或者做一些更有趣的事情来传递代理通信 link。但在这里你 运行 在同一个网络 space 中,在同一个文件系统上,所以足以让你的内部“虚拟机”1 使用您的外部(真实)机器的 ssh 代理获取私钥。
1A Docker 实例更像是 FreeBSD 的“监狱”,而不是真正的 VM。然而,两者都提供了一种“穷人的虚拟机”。