Docker 加载密钥“/root/.ssh/id_rsa”:格式无效

Sha*_*mir 10 git ssh github docker dockerfile

我正在尝试克隆一个包含子模块的存储库。主 repo 克隆正常,但是当我git submodule update --init --recursive在 dockerfile 中执行时,子模块抛出并出错。

fatal: clone of 'git@github.com:jkeys089/lua-resty-hmac.git' into submodule path '/tmp/third-party/lua-resty-hmac' failed
Failed to clone 'third-party/lua-resty-hmac'. Retry scheduled
Cloning into '/tmp/third-party/lua-resty-jwt'...
load pubkey "/root/.ssh/id_rsa": invalid format
Warning: Permanently added the RSA host key for IP address '140.82.118.3' to the list of known hosts.
Load key "/root/.ssh/id_rsa": invalid format
git@github.com: Permission denied (publickey).
Run Code Online (Sandbox Code Playgroud)

在图像中我有这个

# authorise ssh host
RUN mkdir /root/.ssh/ \
    && chmod 700 /root/.ssh \
    && ssh-keyscan github.com > /root/.ssh/known_hosts

# add key and set permission
RUN echo "${SSH_PRIVATE_KEY}" >> /root/.ssh/id_rsa \
    && echo "$ssh_pub_key" > /root/.ssh/id_rsa.pub \
    && chmod 600 /root/.ssh/id_rsa.pub \
    && chmod 600 /root/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

我无法控制子模块。我不确定是否可以从git@github.comhttps更改为获取子模块。

我什至尝试使用GITHUB_TOKEN路线

# start up git and clone
RUN git config --global url."https://${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/" \
    && git clone https://github.com/GluuFederation/gluu-gateway.git /tmp \
    && cd /tmp/ \
    && git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)

下面是构建命令的部分。 build --build-arg GITHUB_TOKEN=${GITHUB_TOKEN} --build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)" --build-arg ssh_pub_key="$(cat ~/.ssh/id_rsa.pub)"

请帮忙解决这个问题。这很令人沮丧。:(

Lit*_*Zha 11

仅供参考。

我手动创建了一个私钥文件key.id_rsa并将内容粘贴到其中。但是当我用它来克隆 git 存储库时:

$ git clone my_repo
Cloning into 'my_repo'...
Load key "/path/to/key.id_rsa": invalid format
Run Code Online (Sandbox Code Playgroud)

密钥的内容肯定是正确的。所以然后我尝试将我的密钥与其他生成的密钥进行比较ssh-keygen,它确实是无效的格式

我的钥匙里没有新行的结尾

在键的末尾添加新行后,一切都很愉快~真是一个惊喜!

[更新]:记住使用\n而不是\r\n在 Windows 上。


Von*_*onC 8

如果密钥是“无效格式”,请尝试使用旧的 PEM 格式重新生成它。

ssh-keygen -m PEM -t rsa -P "" 
Run Code Online (Sandbox Code Playgroud)

确保将公钥添加到您的 GitHub 帐户以进行正确的身份验证。

OP Shammir增加的评论

我认为问题是在构建过程中没有从主机复制到 docker 镜像。

在“docker build --build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)"返回空”中,Shammir 用于dockito/vault管理私钥,但也将其配置为“AddKeysToAgent”:如果私钥不受密码保护,则不需要(如我上面的命令)


小智 8

另一个可能的问题是,如果您使用 Makefile 来运行 docker build 命令。在这种情况下,Makefile 中的命令将类似于:

docker-build:
    docker build --build-arg SSH_PRIVATE_KEY="$(shell cat ~/.ssh/id_rsa)"
Run Code Online (Sandbox Code Playgroud)

Make不幸的是用空格替换换行符(make shell

这意味着写入容器的 ssh 密钥具有不同的格式,从而产生上述错误。

我找不到在 Makefile 命令中保留换行符的方法,所以我采取了一种解决方法,将 .ssh 目录复制到 docker 构建上下文中,通过 Dockerfile 复制文件,然后将它们删除。


小智 8

这个答案适用于 Windows 用户(尚未在 Linux 上尝试过)。

我搜索了很多答案和文章,但在构建我的 docker 映像时仍然遇到无效格式错误。

实际原因是,当我们将私钥文件的内容作为参数传递时,它们是在一行中传递的。转义字符被转换为空格,这对于密钥来说基本上是无效的格式。为了避免这个错误,有两种方法将私钥传递给docker镜像:

  1. 在docker文件中使用COPY命令复制私钥文件并在docker镜像中使用。这不被认为是一个好的选择,因为它可能会暴露您的私钥。例子:COPY id_rsa /root/.ssh/id_rsa
  2. 这是我使用过的一种技巧并且它有效。在文本编辑器中打开私钥文件,然后\n在私钥的每一行末尾添加并连接每一行以在一行中创建整个密钥。例如,您生成的密钥如下所示:

-----开始 OPENSSH 私钥----- b3BlbnNzaC1redjEAAAAABG5vvmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW QyNTUxOQAAACdmF7/Vo4m2FWPf+8uZRRF88dnsyj+z+lCWNWBrT8gAAAJh1tssodbbL -----结束 OPENSSH 私钥---- -

让它看起来像这样:

-----开始 OPENSSH 私钥----- \nb3BlbnNzaC1redjEAAAAABG5vvmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW \nQyNTUxOQAAACdmF7/Vo4m2FWPf+8uZRRF88dnsyj+z+lCWNWBrT8gAAAJh1tssodbbL \n-----结束 OPENSSH 私钥---- -\n

将其保存在密钥文件中,并在构建 docker 映像时将修改后的文件传递到参数中。