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
相关产品推荐
相关产品推荐

