为Scala项目构建Docker容器遇exit code 134错误求解决方案
解决Scala项目Docker构建exit code 134问题及优化Dockerfile配置
一、解决exit code 134错误的可行方案
错误码134通常表示进程收到SIGABRT信号,除了Docker内存不足,还可以尝试以下方法:
调整sbt的JVM内存参数
即使Docker分配了足够内存,sbt默认的堆内存限制可能仍然偏低。在构建命令中显式指定内存参数:RUN SBT_OPTS="-Xmx2G -Xms1G" sbt clean compile package根据实际情况调整
-Xmx(最大堆内存)和-Xms(初始堆内存)的值。更换兼容的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,兼容性和稳定性更好。
简化构建步骤,排查问题
- 暂时去掉
clean命令,避免强制重新编译所有代码:RUN sbt compile package - 单独执行依赖下载:先运行
RUN sbt update,确认依赖能正常下载后再执行编译。
- 暂时去掉
检查项目配置
确保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
相关产品推荐
相关产品推荐

