执行GitLab CI/CD配置文件时bash未找到错误的解决方法
解决GitLab CI中
bash: not found的问题 这个错误的核心原因是你在执行bash docker_install.sh时,当前Job使用的镜像里没有预装bash命令,而且你的全局before_script只适配了Alpine镜像的包安装逻辑(用apk),但其他Job用的是不同基础的镜像,导致要么bash没装,要么apk命令直接失效。
下面给你几个可行的解决方案,按推荐程度排序:
方案1:改用sh执行脚本(最简单,优先尝试)
如果你的docker_install.sh脚本没有依赖bash特有的语法(比如数组、[[ ]]条件判断、进程替换这类POSIX sh不支持的特性),直接把执行命令改成用sh运行:
before_script: # 注意:这个apk命令仅在Alpine镜像生效,如果Build Job用的是其他镜像,需要调整包管理命令 - apk update && apk add openssh - sh docker_install.sh > /dev/null
几乎所有Linux容器镜像都会预装sh,这样就能直接避开bash不存在的问题。
方案2:针对不同Job的镜像类型单独配置依赖安装
因为你的三个Job用了不同的镜像(Build用默认镜像、Deploy用php:7.4(Debian基础)、Loadtest用k6(Alpine基础)),全局before_script里的apk命令在Debian镜像里会报错,所以需要给每个Job单独配置before_script,适配对应的包管理工具:
修改后的完整.gitlab-ci.yml示例:
stages: - build - deploy - loadtest-local build: stage: build # 假设默认镜像为Alpine,安装bash和openssh before_script: - apk update && apk add openssh bash script: - echo "building my application in container..." - bash docker_install.sh > /dev/null deploy: stage: deploy image: php:7.4 # php:7.4基于Debian,默认自带bash,只需安装openssh即可 before_script: - apt-get update && apt-get install -y openssh script: - phpunit Unittest.php loadtest-local: image: name: loadimpact/k6:latest entrypoint: [""] stage: loadtest-local # k6镜像基于Alpine,安装bash和openssh before_script: - apk update && apk add openssh bash script: - k6 run ./loadtests/performance-test.js - k6 run ./loadtests/inttest.js
方案3:统一使用带bash的基础镜像
如果你的Build阶段没有指定镜像,可以直接指定一个预装bash的镜像,比如Ubuntu:
build: stage: build image: ubuntu:latest before_script: - apt-get update && apt-get install -y openssh script: - echo "building my application in ubuntu container..." - bash docker_install.sh > /dev/null
Ubuntu默认自带bash,这样就不需要额外安装了。
另外,建议检查一下docker_install.sh的脚本开头,如果是#!/bin/bash,可以改成#!/bin/sh(如果脚本兼容的话),这样即使环境里没有bash,也能通过sh正常执行。
内容的提问来源于stack exchange,提问作者Detlef7able
相关产品推荐
相关产品推荐

