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

Jenkins声明式流水线运行Docker镜像时script.sh未找到问题排查

问题原因及解决方案

问题根源

出现script.sh: not found错误主要有三个核心原因:

  • 镜像缺少shell环境:你的gocopyright镜像可能是极简镜像(比如基于scratch或未安装shell的alpine),Jenkins的sh步骤需要容器内有sh/bash来执行临时脚本,没有对应环境就会找不到脚本文件。
  • 手动挂载路径冲突:你在args里指定-v $PWD:/workspace,但Jenkins环境中的$PWD和本地环境不同,且Jenkins的Docker Agent会自动挂载工作空间到容器,手动挂载会导致路径覆盖或权限问题,干扰临时脚本的执行。
  • 镜像Entrypoint设置问题:如果镜像的Entrypoint被设为gocopyright,Jenkins启动容器时会把临时脚本路径作为参数传给Entrypoint,导致gocopyright无法识别该参数,进而报错。

解决步骤

1. 验证镜像是否包含shell环境

本地执行以下命令,测试容器能否运行shell:

docker run --rm avidregistry.azurecr.io/my_repo/gocopyright:latest sh -c "echo hello"

如果执行失败,说明镜像缺少shell,需要修改镜像构建文件(比如Dockerfile):

  • 若基于alpine,添加RUN apk add --no-cache bash或RUN apk add --no-cache busybox
  • 换用带shell的基础镜像(比如golang:alpine而非scratch)

2. 修改Jenkinsfile配置

去掉手动挂载参数,根据镜像情况调整Entrypoint:

stage('Copyright') {
    agent {
        docker {
            image 'avidregistry.azurecr.io/my_repo/gocopyright:latest'
            reuseNode true
            // 如果镜像Entrypoint是gocopyright,覆盖为空,让Jenkins能执行shell
            entrypoint ''
        }
    }
    steps {
        sh 'cd /workspace && gocopyright -g' // 确保在工作空间执行命令
        sh 'ls -la'
        sh 'pwd'
    }
}

说明:

  • 移除args '-v $PWD:/workspace',Jenkins会自动挂载当前流水线的工作空间到容器内。
  • 添加entrypoint ''可以覆盖镜像默认的Entrypoint,让Jenkins正常执行sh步骤。
  • 用cd /workspace确保命令在正确的目录执行(如果Jenkins挂载的路径不是/workspace,可通过pwd查看后调整)。

3. 备选方案:直接在docker命令中执行任务

如果不想修改镜像或Entrypoint,可以直接在sh步骤中调用docker run命令(前提是Jenkins节点已安装docker且有权限):

stage('Copyright') {
    steps {
        sh 'docker pull avidregistry.azurecr.io/my_repo/gocopyright:latest'
        sh 'docker run -v $PWD:/workspace avidregistry.azurecr.io/my_repo/gocopyright:latest gocopyright -g'
    }
}

这种方式和本地执行逻辑一致,避开Docker Agent的自动挂载和Entrypoint问题。

内容的提问来源于stack exchange,提问作者annd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:35:15