我在 docker 容器中运行 spring 应用程序时遇到问题(spring 和 docker 在我的环境中都有最新版本)。 我希望应用程序类 AnalysisServiceBootstrap 拥有健康的生命周期:在创建 AnalysisServiceBootstrap 之后立即使用方法 start() 运行初始化代码,并在 AnalysisServiceBootstrap 销毁之前立即运行方法 stop() (我想在有人运行 stop() 代码时停止应用程序)。
我有以下代码:
package com.pack;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
@SpringBootApplication
public class AnalysisServiceBootstrap {
// called OK on docker "start <containerId>"
@PostConstruct
public void start() throws Exception {
// some init code
}
// NOT called on "docker stop <containerId>"
@PreDestroy
public void stop() {
// some destroy code
}
public static void main(String[] args) {
SpringApplication.run(AnalysisServiceBootstrap.class, args);
}
}
出于某种原因,我无法在 docker stop 上运行 stop() 方法。 我尝试了 stackoverflow 和其他资源上提供的几种方法,但它们都不适合我。
我很高兴拥有适合您的代码(不仅仅是一些时髦的建议)。
这里几乎是我的 docker 文件:
FROM *********:6556/service-jvm
ARG SERVICE_JAR_FILE
ENV SERVICE_NAME service
ENV HTTP_PORT 603
ENV HTTPS_PORT 604
ENV SERVICE_JAR /opt/my/project/${SERVICE_JAR_FILE}
EXPOSE ${HTTP_PORT} ${HTTPS_PORT}
COPY ${SERVICE_JAR_FILE} /opt/my/project/${SERVICE_JAR_FILE}
CMD java -Xms1024m -Xmx1024m -dump:"/opt/my/project/dumppath" -javaagent:/opt/my/project/agent.jar -Djav.awt.headless=true -jar ${SERVICE_JAR}
但是我们邀请您在这里发布您拥有的任何工作 docker 文件。
非常感谢。
请您参考如下方法:
来自文档:
docker stop
Stop one or more running containers The main process inside the container will receive
SIGTERM
, and after a grace period,SIGKILL
通过执行 docker stop
,您只是终止了 java (Spring) 进程。
那么 Spring 上下文将正确关闭的保证是什么?
在 Spring 应用程序中处理 SIGTERM
的正确方法是添加关闭钩子(Hook)。
最终代码应该是这样的:
package com.pack;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
@SpringBootApplication
public class AnalysisServiceBootstrap {
@PostConstruct
public void start() throws Exception {
// some init code
}
@PreDestroy
public void tearDown() {
// some destroy code
}
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
// write here any instructions that should be executed
tearDown();
}
});
SpringApplication.run(AnalysisServiceBootstrap.class, args);
}
}
该过程在以下问题中进行了描述: