我正在尝试克隆一个包含子模块的仓库。主存储库克隆正常,但是当我在dockerfile中执行git submodule update --init --recursive
时,子模块会抛出错误。
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).
在图片中我有这个
# 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
我无法控制子模块。我不确定是否可以从git@github.com
更改为https以获取子模块。
我什至尝试使用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
以下是构建命令的一部分。
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)"
请对此提供帮助。非常令人沮丧。 :(
答案 0 :(得分:2)
另一个可能的陷阱是,如果您使用Makefile运行docker build命令。在这种情况下,Makefile中的命令将类似于:
docker-build:
docker build --build-arg SSH_PRIVATE_KEY="$(shell cat ~/.ssh/id_rsa)"
Make
很遗憾,换行符用空格(make shell)
这意味着写入容器的ssh密钥具有不同的格式,从而产生上述错误。
我找不到在Makefile命令中保留换行符的方法,因此我采取了一种解决方法,将.ssh目录复制到docker build上下文中,通过Dockerfile复制文件,然后将其删除。 / p>
答案 1 :(得分:1)
如果密钥为“无效格式”,请尝试使用old PEM format重新生成。
ssh-keygen -m PEM -t rsa -P ""
请确保将公钥添加到您的GitHub帐户以进行正确的身份验证。
我认为问题是在构建期间没有任何内容从主机复制到docker映像。
在“ docker build --build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)"
returning empty”中,Shammir使用dockito/vault
来管理私钥,但也将其配置为“ AddKeysToAgent”:如果私钥不受密码短语的保护,则不需要(例如上面的命令)
答案 2 :(得分:1)
请勿使用 echo "${SSH_PRIVATE_KEY}" >> /root/.ssh/id_rsa
传递私钥(公钥也一样)。我在尝试时遇到了类似的错误 Load key "/root/.ssh/id_rsa": invalid format
RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa && chmod 600 /root/.ssh/id_rsa
这导致了 identity file /root/.ssh/id_rsa type -1 invalid format
和 read_passphrase: can't open /dev/tty
之类的错误。
正确的方法是使用
COPY id_rsa /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa
解决方案说明:我的私钥格式错误 - 不是多行,而是作为一行传递,并且您可能有任何其他格式问题,例如开头或结尾处忘记的“-”,或其他内容行尾有误,例如缺少换行符格式或行尾有额外的字母。
有关详细信息,请参阅 Dockerfile: clone repo with passwordless private key. Errors: “authentication agent” or “read_passphrase: can't open /dev/tty”,其主要思想来自 Add private key to ssh-agent in docker file,其思想再次来自 Gitlab CI/Docker: ssh-add keeps asking for passphrase。
答案 3 :(得分:0)
仅供参考。
我手动创建了一个私钥文件 key.id_rsa
并将内容粘贴到其中。但是当我用它来克隆 git 存储库时:
$ git clone my_repo
Cloning into 'my_repo'...
Load key "/path/to/key.id_rsa": invalid format
密钥的内容绝对正确。然后我尝试通过 ssh-keygen
将我的密钥与其他生成的密钥进行比较,这确实是格式无效。
只是在我的密钥中没有换行结束。
在key的末尾添加新行后,一切都很愉快~太惊喜了!
[更新]:记住即使在 Windows 上也要使用 \n
而不是 \r\n
。
答案 4 :(得分:0)
此答案适用于 Windows 用户(尚未在 linux 上尝试过)。
我搜索了很多答案和文章,但在构建我的 docker 镜像时仍然遇到无效格式错误。
真正的原因是,当我们将私钥文件的内容作为参数传递时,它们是在一行中传递的。转义字符被转换为空格,这对于密钥来说基本上是无效的格式。为了避免这个错误,有两种方法可以将私钥传递给 docker 镜像:
COPY
命令复制私钥文件并在docker镜像中使用。这不是一个好的选择,因为它可能会暴露您的私钥。示例:COPY id_rsa /root/.ssh/id_rsa
\n
并连接每一行以在一行中创建整个密钥。例如,您生成的密钥如下所示:-----开始打开SSH私钥----- b3BlbnNzaC1redjEAAAAABG5vvmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW QyNTUxOQAAACdmF7/Vo4m2FWPf+8uZRRF88dnsyj+z+lCWNWBrT8gAAAJh1tssodbbL -----结束打开SSH私钥-----
让它看起来像这样:
<块引用>-----BEGIN OPENSSH 私钥-----\n
b3BlbnNzaC1redjEAAAAABG5vvmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW\n
QyNTUxOQAAACdmF7/Vo4m2FWPf+8usyWaaacdmF7/Vo4m2FWPf+8usjWaaaaaaaaaaaaaaaaaaaaabag5vvmUAAAAEbm9uZQAAAAAAAAABAAA
OPENSSH 私钥-----\n
将其保存在密钥文件中,并在构建 docker 镜像时将修改后的文件传递到参数中。