docker挂载git-credential操作提示fatal: could not read Username for : terminal prompts disabled

我是在ci环境下配置了https的git鉴权,官方文档先看一下Git – 凭证存储。

问题描述

在ci(Jenkins)环境中挂载了git-credential文件,进行构建会遇到凭证(credential)不生效的问题。控制台输出fatal: could not read Username for : terminal prompts disabled。

排查

可以通过打印的方式确认存在,文件的内容和权限也没问题。

通过输出的错误可以定位到git源码中读取凭证的相关代码,发现git会先读取credential文件,然后重新写入一个新的同名文件。

再结合docker中挂载volume的相关逻辑发现挂载单个文件是通过inode来定位文件的。

linux文件系统中一个文件被删除,然后重新创建同名文件,inode是不同的。

自此问题原因查明,在构建过程中,git拉取代码的时候改变了credential文件的inode,导致后续的go get操作(其实就是git)因为读取不到凭证而构建过程失败。

解决方案

有两个办法可以解决

  • 在jenkins的容器中启动构建的时候,通过-e或者-c的方式,把credential的内容传进容器内,类似于
git config --global credential.helper store --file=~/.git-credentials && echo $(_GIT_CREDENTIALS) > ~/.git-credentials
  • 直接挂载目录

后记

注意.gitconfig指定.git-credentials文件位置的时候不要用相对路径。

虽然是挺小的问题,但是背后其实涉及到了git源码中凭证代码,docker的挂载原理和linux文件系统3个领域知识,还是费了一些时间的。鉴于google上也没有答案,记录下来希望可以帮到你。

    原文作者:黄承开
    原文地址: https://zhuanlan.zhihu.com/p/25776682
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞