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 上。
如果密钥是“无效格式”,请尝试使用旧的 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镜像:
COPY命令复制私钥文件并在docker镜像中使用。这不被认为是一个好的选择,因为它可能会暴露您的私钥。例子:COPY id_rsa /root/.ssh/id_rsa\n在私钥的每一行末尾添加并连接每一行以在一行中创建整个密钥。例如,您生成的密钥如下所示:-----开始 OPENSSH 私钥----- b3BlbnNzaC1redjEAAAAABG5vvmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW QyNTUxOQAAACdmF7/Vo4m2FWPf+8uZRRF88dnsyj+z+lCWNWBrT8gAAAJh1tssodbbL -----结束 OPENSSH 私钥---- -
让它看起来像这样:
-----开始 OPENSSH 私钥-----
\nb3BlbnNzaC1redjEAAAAABG5vvmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW\nQyNTUxOQAAACdmF7/Vo4m2FWPf+8uZRRF88dnsyj+z+lCWNWBrT8gAAAJh1tssodbbL\n-----结束 OPENSSH 私钥---- -\n
将其保存在密钥文件中,并在构建 docker 映像时将修改后的文件传递到参数中。
| 归档时间: |
|
| 查看次数: |
19627 次 |
| 最近记录: |