問題描述:
Docker 直接停止鏡像,spirngCloud服務直接停止,並未正常從注冊中心下線。
問題原因:
- 使用 docker stop 關閉容器時, 只有 init(pid 1)進程能收到中斷信號, 如果容器的pid 1 進程是 sh 進程, 它不具備轉發結束信號到它的子進程的能力, 所以我們真正的java程序得不到中斷信號, 也就不能實現優雅關閉
- 關閉動作並未傳遞到我們自己運行的進程中。
解決方案:
- 通過運行exec命令,它將代替shell進程把SIGTERM傳播到應用線程
- ENTRYPOINT [ "sh", "-c", "exec java -jar /apps/app.jar"]
Spring 官方資料 :https://spring.io/guides/topicals/spring-boot-docker
具體如何修改:
- docker-maven-plugin 插件配置修改
- 原先:
<entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
- 修改為:
<entryPoint>["sh","-c","execjava-jar/${project.build.finalName}.jar"]</entryPoint>
實驗測試:
運行容器 run
- 服務正常注冊,注冊中心接口 返回狀態碼 204
停止容器 stop
- 觸發spring容器注銷事件, 注冊中心接口返回狀態碼 204 ,服務在注冊中心狀態為 DOWN
重要說明:
Docker Kill 命令不支持!
Kill 容器之間殺死,可以看做是宿主機直接殺死了一個進程,觸發不了,注銷事件。