K8s CronJob容器无法执行ConfigMap挂载的bash脚本求助
Kubernetes CronJob脚本执行失败:No such file or directory 排查与修复
核心问题分析
从日志和配置来看,导致报错的原因集中在以下三点:
1. 脚本执行路径错误
Pod日志显示当前工作目录为/usr/src,你执行的./repo/clone.sh是在当前目录下查找repo/clone.sh,但实际repo目录挂载在根目录/repo,相对路径写法错误导致系统找不到文件。
2. 脚本缺少执行权限
ConfigMap挂载的defaultMode设置为420(对应Linux权限644),脚本没有可执行权限,即便路径正确也无法直接运行。
3. 脚本Shebang语法错误
clone.sh开头写的是#!bin/bash,缺少根路径斜杠,正确写法应为#!/bin/bash,否则系统无法定位bash解释器。
额外冗余配置
你的Init容器仅执行cd /操作,无实际作用,还会增加Pod启动复杂度,建议直接移除。
解决方案
步骤1:修正脚本执行命令
将主容器中的./repo/clone.sh改为绝对路径调用,或先切换到根目录再执行:
# 方案A:绝对路径直接调用 bash /repo/clone.sh # 方案B:切换目录后执行 cd / && ./repo/clone.sh
步骤2:调整ConfigMap挂载权限
修改CronJob的volume配置,将defaultMode改为511(对应Linux权限755),让脚本拥有可执行权限:
volumes: - configMap: defaultMode: 511 name: product-configmap name: repo-checkout
步骤3:修复脚本Shebang
修改ConfigMap中的clone.sh开头:
#!/bin/bash
步骤4:移除无用Init容器
删除CronJob配置中的initContainers段,简化Pod结构。
修复后的完整配置示例
CronJob配置
spec: concurrencyPolicy: Allow jobTemplate: metadata: spec: template: metadata: spec: containers: - args: - -c - | set -x pwd && ls ls -ltr / cat /repo/clone.sh # 用绝对路径调用脚本,依赖bash解释器执行 bash /repo/clone.sh pwd command: - /bin/bash envFrom: - configMapRef: name: sonarscanner-configmap image: artifactory.build.team.com/product-containers/user/sonarqube-scanner:4.7.0.2747 imagePullPolicy: IfNotPresent name: sonarqube-sonarscanner securityContext: runAsUser: 0 volumeMounts: - mountPath: /repo name: repo-checkout dnsPolicy: ClusterFirst restartPolicy: OnFailure securityContext: fsGroup: 0 volumes: - configMap: defaultMode: 511 name: product-configmap name: repo-checkout schedule: '*/1 * * * *'
ConfigMap配置
kind: ConfigMap metadata: apiVersion: v1 data: clone.sh: |- #!/bin/bash set -xe apk add git curl #Containers that fail to resolve repo url can use below step. repo_url=$(nslookup ${CODE_REPO_URL} | grep Non -A 2 | grep Name | cut -d: -f2) repo_ip=$(nslookup ${CODE_REPO_URL} | grep Non -A 2 | grep Address | cut -d: -f2) if grep ${repo_url} /etc/hosts; then echo "git dns entry exists locally" else echo "Adding dns entry for git inside container" echo ${repo_ip} ${repo_url} >> /etc/hosts fi cd / && cat /etc/hosts && pwd git clone "https://$RU:$RT@${CODE_REPO_URL}/r/a/${CODE_REPO_NAME}" && \ (cd "${CODE_REPO_NAME}" && mkdir -p .git/hooks && \ curl -Lo `git rev-parse --git-dir`/hooks/commit-msg \ https://$RU:$RT@${CODE_REPO_URL}/r/tools/hooks/commit-msg; \ chmod +x `git rev-parse --git-dir`/hooks/commit-msg) cd ${CODE_REPO_NAME} pwd
补充说明
- 若不想修改
defaultMode,直接用bash /repo/clone.sh执行即可,无需依赖脚本自身的可执行权限。 - 脚本中
cd code_dir建议改为cd "${CODE_REPO_NAME}",避免变量未解析导致的路径错误。
内容的提问来源于stack exchange,提问作者AhmFM
相关产品推荐
相关产品推荐

