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

为Scala项目构建Docker容器遇exit code 134错误求解决方案

解决Scala项目Docker构建exit code 134问题及优化Dockerfile配置

一、解决exit code 134错误的可行方案

错误码134通常表示进程收到SIGABRT信号,除了Docker内存不足,还可以尝试以下方法:

  1. 调整sbt的JVM内存参数
    即使Docker分配了足够内存,sbt默认的堆内存限制可能仍然偏低。在构建命令中显式指定内存参数:

    RUN SBT_OPTS="-Xmx2G -Xms1G" sbt clean compile package
    

    根据实际情况调整-Xmx(最大堆内存)和-Xms(初始堆内存)的值。

  2. 更换兼容的sbt/Scala/JDK镜像
    你当前使用的hseeberger/scala-sbt:8u222_1.3.5_2.13.1中JDK版本较老,可能存在兼容性问题。尝试使用更新的镜像,比如:

    FROM hseeberger/scala-sbt:17.0.8_1.9.6_2.13.12 as build
    

    这个镜像搭配JDK17、sbt1.9.6和Scala2.13.12,兼容性和稳定性更好。

  3. 简化构建步骤,排查问题

    • 暂时去掉clean命令,避免强制重新编译所有代码:RUN sbt compile package
    • 单独执行依赖下载:先运行RUN sbt update,确认依赖能正常下载后再执行编译。
  4. 检查项目配置
    确保build.sbt配置正确,比如Hello World项目的最简配置:

    name := "HelloWorld"
    version := "0.1"
    scalaVersion := "2.13.1" // 和镜像中的Scala版本保持一致
    

二、优化后的Dockerfile配置

针对sbt项目的Docker构建,优化后的配置可以提升构建速度、减少镜像体积:

# 构建阶段:使用更新的sbt镜像
FROM hseeberger/scala-sbt:17.0.8_1.9.6_2.13.12 as build
WORKDIR /app

# 先复制依赖配置文件,利用Docker缓存层
COPY build.sbt .
COPY project/ ./project/

# 预下载依赖,修改src代码时无需重新下载
RUN sbt update

# 复制源代码并编译打包
COPY src/ ./src/
RUN SBT_OPTS="-Xmx2G -Xms1G" sbt compile package

# 运行阶段:使用轻量的JRE镜像
FROM eclipse-temurin:17-jre-slim
WORKDIR /app

# 复制编译后的jar包(指定具体路径,避免复制多余文件)
COPY --from=build /app/target/scala-2.13/helloworld_2.13-0.1.jar app.jar

# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]

优化点说明:

  • 缓存依赖层:先复制build.sbt和project目录,执行sbt update缓存依赖,后续修改源代码时不会重复下载依赖。
  • 指定精确的jar路径:避免使用*.jar,防止复制到测试jar或其他无关文件,需要根据你的项目名称和版本调整路径。
  • 使用轻量运行镜像:eclipse-temurin:17-jre-slim比官方openjdk镜像更精简,且维护更积极。
  • 显式设置sbt内存参数:确保编译阶段有足够内存。

如果你的项目需要打包成包含所有依赖的胖jar,可以使用sbt-assembly插件,修改build.sbt添加插件后,将构建命令改为RUN sbt assembly,然后复制target/scala-2.13/helloworld-assembly-0.1.jar到运行阶段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:21:15