0

在 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为 cmd indocker run
  • -Dloader.main=MyOtherAppJAVA_TOOL_OPTIONS环境变量中指定
  • 指定LOADER_MAIN=MyOtherApp为环境变量

这些选项都没有开始MyOtherApp

4

1 回答 1

0

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

Buildpacks 提供的用于在图像中启动各种进程的所有工具都在文档中进行了描述

我在这里猜测了一下,但听起来你想运行自己的自定义进程(而不是 buildpack 检测到的进程),所以在这里试试这个

您甚至可以覆盖 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

于 2021-05-19T02:58:11.107 回答