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

Jenkins构建Docker镜像失败咨询(Gradle/Grails场景)

解决Jenkins构建Grails项目Docker镜像的两类常见问题

我之前在部署Grails项目到Jenkins时也踩过几乎一模一样的坑——本地跑起来丝滑得很,一到Jenkins就各种报错,给你整理几个实用的排查和解决思路:

一、Grails项目本地构建Docker正常,Jenkins流水线失败

首先得提醒下,你这里只写了Exception:,建议先去Jenkins的构建日志里扒完整的错误栈信息,这能帮你精准定位问题。不过根据我碰到的常见情况,大概率是这几个原因:

  • 依赖拉取受阻:本地已经缓存了所有Grails/Gradle依赖,但Jenkins的Agent环境是干净的,或者公司内网限制了对外仓库的访问,导致拉取不到依赖。
    • 解决办法:给Jenkins配置内网代理(如果需要),或者在流水线脚本里提前执行gradle dependencies拉取依赖;也可以在项目的build.gradle里替换Gradle镜像源为国内镜像(比如阿里云),加快拉取速度。
  • 环境版本不匹配:本地的JDK、Grails、Gradle版本和Jenkins Agent里的不一致,比如本地用JDK17,Jenkins里却是JDK11,很容易导致构建失败。
    • 解决办法:在Jenkins流水线里明确指定Agent镜像,比如用jenkins/gradle:7.6-jdk17这类包含对应版本的镜像;或者在流水线脚本里设置环境变量,比如export GRAILS_VERSION=5.3.2,确保和本地开发环境一致。
  • 文件权限不足:Jenkins运行的用户(通常是jenkins用户)没有权限访问项目文件、执行构建脚本或者写入构建目录。
    • 解决办法:登录Jenkins所在服务器,检查项目工作目录的权限,确保jenkins用户有读写执行权限;或者在流水线里添加步骤,比如chmod +x ./gradlew给Gradle脚本加上执行权限。
  • Docker构建上下文异常:本地构建时的文件上下文和Jenkins里的不一样,比如本地的.dockerignore文件没同步到Jenkins,导致一些不必要的文件被加入构建上下文,或者构建路径指定错误。
    • 解决办法:确保项目根目录的.dockerignore和本地完全一致;在Jenkins流水线执行docker build时,明确指定上下文路径,比如docker build -t my-grails-app .里的.要指向正确的项目根目录。

二、Gradle脚本构建Docker时出现Connection reset by peer at Socket file=/run/docker.sock

这个错误本质是Jenkins进程没法正常连接到Docker Daemon,我碰到过好几次,主要是这几个原因:

  • Docker Socket权限问题:Jenkins用户没有访问/run/docker.sock的权限,这是最常见的原因。
    • 解决办法:登录Jenkins所在服务器,执行usermod -aG docker jenkins把Jenkins用户加入docker用户组,然后重启Jenkins服务;如果是用Docker-in-Docker(DinD)模式的Agent,要确保启动容器时挂载了socket:docker run -v /run/docker.sock:/run/docker.sock ...。
  • Docker Daemon未运行或异常:Jenkins所在机器的Docker服务挂了,或者进程异常导致连接中断。
    • 解决办法:执行systemctl status docker检查Docker服务状态,如果未运行就systemctl start docker,如果异常就systemctl restart docker重启服务。
  • DinD模式下的网络/TLS问题:如果用了DinD,可能是内部网络不通,或者Docker Daemon的TLS配置导致连接失败。
    • 解决办法:测试环境可以暂时关闭TLS验证;如果是网络问题,尝试把DinD容器的网络模式设为host,确保能访问到宿主机的Docker Daemon。
  • Gradle Docker插件配置错误:Gradle的Docker插件没正确指向Docker Socket路径。
    • 解决办法:在项目的build.gradle里明确配置Socket路径:
      docker {
          url = "unix:///run/docker.sock"
      }
      
      或者在Jenkins流水线里设置环境变量:export DOCKER_HOST=unix:///run/docker.sock。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:37:55