微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 bootBuildImage 和 packeto 在 spring boot 中指定替代主类

如何解决如何使用 bootBuildImage 和 packeto 在 spring boot 中指定替代主类

在gradle中调用spring boot插件bootBuildImage任务时,会使用packeto创建一个docker镜像。它启动 springBoot 插件中指定的主类。您可以在下面找到 build.gradle 文件的摘录。

springBoot {
    mainClass = 'MyMainApp'
}


bootBuildImage {
    imageName = "$docker_repo/${project.name}"
}

调用 docker run 时,docker 会运行一个容器,从 MyMainApp 开始。

但是,我想运行另一个主类,使用相同的 docker 镜像。我尝试了以下方法

  • -Dloader.main=MyOtherApp 指定为 docker run 中的 cmd
  • -Dloader.main=MyOtherApp 环境变量中指定 JAVA_TOOL_OPTIONS
  • LOADER_MAIN=MyOtherApp 指定为环境变量

这些选项都没有以 MyOtherApp 开头。

解决方法

由 Buildpacks 创建的映像提供了一些有用的工具来启动您的应用程序。虽然这很好,但覆盖默认启动命令并不像只为 docker run 指定一个新命令那么容易。

Buildpacks 为 starting up various processes in an image are described in the docs 提供的所有工具。

我在这里有点猜测,但听起来您想运行自己的自定义进程(不是 buildpack 检测到的进程),因此请尝试 this one here

您甚至可以覆盖 buildpack 定义的进程类型:

docker run --rm --entrypoint launcher -it multi-process-app bash
docker run --rm --entrypoint launcher -it multi-process-app echo hello "$WORLD" # $WORLD is evaluated on the host machine
docker run --rm --entrypoint launcher -it multi-process-app echo hello '$WORLD' # $WORLD is evaluated in the container after profile scripts are sourced

Java 应该在路径上,因此您可以运行 java -Dloader.main=MyOtherApp org.springframework.boot.loader.PropertiesLauncher

https://www.baeldung.com/spring-boot-main-class#using-cli


或者,您可以将您的应用更改为默认使用 PropetiesLoader 并重建您的图像。 buildpack 只是从 MANIFEST.MF 文件中提取启动命令的启动器。您需要使用 PropertiesLauncher,因为它支持 loader.main。见https://stackoverflow.com/a/66367534/1585136

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。