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  容器之間殺死,可以看做是宿主機直接殺死了一個進程,觸發不了,注銷事件。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM