在Jenkins中Dockerfile无法执行shell脚本的问题排查
Docker容器内执行shell脚本:CLI正常但Jenkins构建失败
我尝试在Docker容器内执行shell脚本,本地命令行测试时运行正常,但在Jenkins中执行失败。
Dockerfile
FROM ubuntu:latest RUN apt-get update \ && apt-get dist-upgrade -y \ && apt-get install -y \ build-essential libgtest-dev \ && apt-get clean WORKDIR /src COPY . . # CLI和Jenkins中都正常运行 RUN echo "test" # CLI和Jenkins中都正常运行 RUN ls # CLI中正常运行,但Jenkins中失败 RUN ./build.sh CMD ["./run_tests.sh"]
构建脚本 docker-build.sh
#!/bin/sh set -x # 停止并删除旧容器(如果存在) docker container stop build-fw docker container rm build-fw docker build -t build-fw . docker run --name build-fw -d -it build-fw docker logs build-fw docker container stop build-fw docker container rm build-fw
Jenkins配置
创建自由风格项目,添加「Execute Shell」构建步骤,执行以下命令:
./docker-build.sh
错误输出
#12 0.586 /bin/sh: 1: ./build.sh: not found #12 ERROR: executor failed running [/bin/sh -c ./build.sh]: exit code: 127 ------ > [8/8] RUN build.sh: ------ executor failed running [/bin/sh -c ./build.sh]: exit code: 127
错误提示./build.sh未找到,但RUN ls命令显示该文件确实存在,请问这是什么原因?
问题原因及解决方案
1. 文件缺少可执行权限
本地CLI环境中你可能手动给build.sh添加了可执行权限,但Jenkins拉取代码后,文件权限可能丢失,COPY到容器内后依然没有执行权限。容器内的sh无法执行没有可执行权限的脚本,就会抛出“not found”这个具有误导性的错误。
解决方案:
- 在Dockerfile的
COPY . .之后添加权限设置:RUN chmod +x ./build.sh ./run_tests.sh - 或者使用Docker 17.09+支持的
COPY参数直接设置权限:COPY --chmod=755 . .
2. 脚本换行符不兼容
如果build.sh是在Windows环境下编写的,文件会带有CRLF(\r\n)换行符,而容器内的sh只能识别LF(\n)换行符。此时shell会把./build.sh\r当作文件名,自然找不到对应的文件。
解决方案:
- 在Jenkins构建步骤中添加换行符转换命令:
dos2unix build.sh - 或者在Git仓库中配置自动转换:设置
core.autocrlf=false,避免Git自动将LF转换为CRLF。
3. Shebang行错误(可能性较低)
如果build.sh的开头是#!/bin/bash,但容器内未安装bash(不过ubuntu:latest默认包含bash),或者shebang行拼写错误,也会导致执行失败。但这种情况的错误提示通常为“no such file or directory”,可作为排查备选。
内容的提问来源于stack exchange,提问作者Gaston
相关产品推荐
相关产品推荐

