有几个前提
即
SpringBoot已经做了相关处理, 我们只要实现接口即可
实现org.springframework.context.SmartLifecycle接口, 实现getPhase/start/stop/isRunning方法, 通过getPhase方法定义优先级
@Override
public int getPhase() {
//在 WebServerGracefulShutdownLifecycle 那一组之后
return SmartLifecycle.DEFAULT_PHASE - 1;
}
容器中只有pid=1的进程才能接收到信号, 所以要保证java的pid=1, dockerfile如下
...
ENV JAVA_OPTS=""
ENV APP_OPTS=""
# 如果用这个格式 sh -c start.sh 会导致pid不为1
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar $APP_OPTS /root/user-web.jar"]
这样, 你的java在容器内的pid就是为1了
日志如下
08:59:04.373 [main ] INFO com.thy.backend.user.service.user.web.UserWebApplication : Starting UserWebApplication v1.0-SNAPSHOT using Java 17.0.2 with PID 1 (/root/user-web.jar started by root in /)
还可以使用https://github.com/krallin/tini/, 将java进程当成tini的子进程执行并执行信号转发
执行docker stop xxx
@Override
public void stop() {
// 输出
log.info("stop");
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。