You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:45:33