sbt 1.6.2 Docker构建报Function not implemented IO异常
报错原因
从错误栈的LinuxWatchService初始化失败信息可以定位核心问题:
sbt 1.6.x 版本默认依赖Linux内核的inotify接口实现文件变更监听,当你使用--platform linux/amd64参数做跨架构Docker构建时(常见于M系列芯片Mac、Windows宿主机,或部分受限的CI构建环境),容器内的运行时没有实现inotify对应的系统调用,也无法访问宿主机的inotify能力,就会抛出Function not implemented的IO异常,直接中断sbt的项目加载流程。
你使用的build.sbt和Scala示例代码来自官方快速入门文档,本身不存在配置或语法错误,不需要调整业务代码。
解决方法
以下方案任选其一即可,优先推荐前两种参数配置方案,适配所有构建环境,且不会改变最终打包产物的内容:
- 开启sbt的CI模式:构建时传入
-Dsbt.ci=true参数,自动关闭交互式终端、文件监听等构建场景不需要的功能,修改Dockerfile中的构建步骤为:
RUN sbt -Dsbt.ci=true package
- 切换文件监听模式为轮询:显式指定sbt不使用系统inotify接口,改用主动轮询的方式检测文件变更,绕开报错的逻辑,修改构建步骤为:
RUN sbt -Dsbt.watch.mode=polling package
- 本地构建适配:如果是在本地Docker Desktop环境触发该问题,可以在Docker设置中把文件共享实现切换为gRPC FUSE,重启Docker服务后重新构建即可,该方案不适用于无法调整运行时配置的CI流水线。
内容的提问来源于stack exchange,提问作者clay
相关产品推荐
相关产品推荐

