已安装Git的Docker容器执行脚本时提示git: command not found
问题根因
核心错误是覆盖了系统内置的PATH环境变量。PATH是Linux系统中用于定义可执行命令搜索路径的核心环境变量,系统执行git这类非内置命令时,会依次遍历PATH中配置的所有目录,查找对应名称的可执行文件。python:3镜像中git默认安装在/usr/bin/git路径下,该路径默认包含在系统初始PATH配置中,因此前期执行git --version、git config命令时可以正常找到git程序。
从执行日志的时序可以明确看到问题触发点:在完成正则匹配分支名后,执行了PATH="${BASH_REMATCH[2]}"赋值操作,这行代码直接将PATH变量的原有值(包含/usr/bin、/bin等系统命令目录的路径列表)完全替换为正则捕获到的分支路径片段,导致后续执行命令时,系统无法在被篡改的PATH列表中找到git可执行文件,最终抛出"git: command not found"错误。
修复方案
- 更换自定义变量名,不要占用系统内置的
PATH变量名,这是最稳妥无副作用的方案:
# 将原有的PATH变量重命名为无冲突的自定义名称,例如SUBMODULE_PATH regex="^report\/[^\/]*\/([^\/]*)\/(.*)" [[ $CI_COMMIT_BRANCH =~ $regex ]] CUSTOMER="${BASH_REMATCH[1]}" SUBMODULE_PATH="${BASH_REMATCH[2]}" RELPATH=$(.ci/scripts/find_relative.py "${CI_PROJECT_PATH}" "${SUBMODULE_PATH}") git submodule add ${RELPATH} ${CUSTOMER}
- 移除冗余的git安装步骤:日志已经明确显示
python:3镜像预装了最新适配版本的git,提前执行apt-get update && apt-get install -y git只会增加流水线执行耗时,没有实际作用,可以直接删除。 - (不推荐)如果一定要使用
PATH作为自定义变量名,赋值时需要追加原有PATH值而非全量覆盖,例如PATH="${BASH_REMATCH[2]}:$PATH",但这种写法存在路径优先级冲突的隐患,可能引发其他命令调用异常,不建议使用。
内容的提问来源于stack exchange,提问作者Michaela DeForest
相关产品推荐
相关产品推荐

