zoukankan      html  css  js  c++  java
  • Docker 部署Spring boot 项目如何优雅的关闭(Eureka下线)

    问题描述:

    Docker 直接停止镜像,spirngCloud服务直接停止,并未正常从注册中心下线。

     

    问题原因:

     

    1. 使用 docker stop 关闭容器时, 只有 init(pid 1)进程能收到中断信号, 如果容器的pid 1 进程是 sh 进程, 它不具备转发结束信号到它的子进程的能力, 所以我们真正的java程序得不到中断信号, 也就不能实现优雅关闭
    2. 关闭动作并未传递到我们自己运行的进程中。

     

    解决方案:

     

    1. 通过运行exec命令,它将代替shell进程把SIGTERM传播到应用线程
    2. ENTRYPOINT [ "sh", "-c", "exec java -jar /apps/app.jar"]

     

    Spring 官方资料 :https://spring.io/guides/topicals/spring-boot-docker

     

    具体如何修改:

    1. docker-maven-plugin 插件配置修改

     

    1. 原先:

     <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>

    1. 修改为:

    <entryPoint>["sh","-c","execjava-jar/${project.build.finalName}.jar"]</entryPoint>

     

    实验测试:

     

    运行容器  run

     

     

    1. 服务正常注册,注册中心接口 返回状态码 204

     

    停止容器 stop

     

     

    1. 触发spring容器注销事件, 注册中心接口返回状态码 204  ,服务在注册中心状态为 DOWN

     

    重要说明:

     

    Docker  Kill  命令不支持!  

     

    Kill  容器之间杀死,可以看做是宿主机直接杀死了一个进程,触发不了,注销事件。

     

     

     

  • 相关阅读:
    两小时后执行打开浏览器的操作
    Markdown语法
    Python机器学习2.2
    身份证姓名与身份证号校验
    根据银行卡号获取开户行
    生成微信小程序二维码
    .net 生成二维码
    微信支付API V3(.Net Core)
    .net 生成项目xml描述文件
    汉字排序问题
  • 原文地址:https://www.cnblogs.com/atliwen/p/12882112.html
Copyright © 2011-2022 走看看