问题描述
在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。