多模块SBT项目使用sbt-docker插件发布时未指定仓库的问题求助
我来帮你解决这个问题!你遇到的「Repository for publishing is not specified」错误,本质是sbt-docker不知道要把镜像推送到哪个Docker仓库(这里就是你的Docker Hub账号下的仓库),而且多模块项目需要针对性配置哪些模块构建Docker镜像、哪些跳过。
下面是修改后的build.sbt配置方案,完全适配你的需求:
1. 先确认插件依赖(如果还没加)
首先确保在project/plugins.sbt中已经引入sbt-docker插件:
addSbtPlugin("com.typesafe.sbt" % "sbt-docker" % "1.9.0") // 版本可根据实际情况调整
2. 修改build.sbt核心配置
// 全局基础配置:指定Docker镜像的基础JDK环境 ThisBuild / dockerBaseImage := "openjdk:17-jre-slim" // 定义通用的「跳过Docker任务」配置,给不需要构建镜像的模块使用 lazy val skipDockerTasks = Seq( docker := {}, dockerPublishLocal := {}, dockerPublish := {} ) // 根模块:聚合所有子模块,但自身跳过Docker任务 lazy val root = (project in file(".")) .aggregate(api, app, common) // 替换common为你实际不需要Docker的模块名 .settings(skipDockerTasks) // 不需要Docker的模块:比如common工具模块,直接应用跳过配置 lazy val common = (project in file("common")) .settings(skipDockerTasks) // API模块:配置Docker镜像并指定Docker Hub仓库 lazy val api = (project in file("api")) .settings( // 关键:指定完整的Docker Hub镜像路径(格式:你的Docker Hub用户名/镜像名) dockerImageName := "your-dockerhub-username/api-service", // 或者拆分配置:先指定仓库,再写镜像名 // dockerRepository := Some("your-dockerhub-username"), // dockerImageName := "api-service", // 配置容器暴露端口(根据你的API服务实际端口调整) dockerExposedPorts := Seq(8080), // 容器启动命令(默认运行打包后的jar包) dockerEntrypoint := Seq("java", "-jar", s"${name.value}-${version.value}.jar") ) // App模块:同理配置Docker镜像 lazy val app = (project in file("app")) .settings( dockerImageName := "your-dockerhub-username/app-service", dockerExposedPorts := Seq(8081), // 调整为你的App服务端口 dockerEntrypoint := Seq("java", "-jar", s"${name.value}-${version.value}.jar") )
3. 发布到Docker Hub的步骤
- 登录Docker Hub:在终端执行
sbt dockerLogin,按照提示输入你的Docker Hub用户名和密码;或者提前用docker login命令登录本地Docker客户端。 - 发布单个模块:执行
sbt api/docker:publish或sbt app/docker:publish - 同时发布两个模块:执行
sbt api/docker:publish app/docker:publish
错误原因说明
之前的报错是因为没有给镜像指定完整的仓库路径——Docker需要明确知道要把镜像推送到哪个用户的仓库下,要么通过dockerRepository指定你的Docker Hub用户名,要么直接在dockerImageName里写全用户名/镜像名的格式。
内容的提问来源于stack exchange,提问作者Cassie
相关产品推荐
相关产品推荐

