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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:40:23