---
tags : docker
---
# Docker Graceful Shutdown
有時候特定的 request不能被重啟的動作中斷,例如幫顧客購款,或是需要寫入連續資料的情境,在執行過程中被中斷會導致資料一致性的問題。
我們可以在 docker-compose加入一些設定,避免 request只做到一半就被 restart。
## Docker container update
以下是 docker swarm在 update container的流程:

當我們更新 container時,docker swarm會先送出一個命令 `SIGTERM`通知 container即將被重啟,然後等待 10秒(預設值)接著送出 `SIGKILL`,此時 container正式被 kill掉。
* SIGTERM : 通知 container即將結束的訊號
* SIGKILL : 如果在指定的等待時間內沒有結束,就會改送出 SIGKILL 訊號,此時作業系統就會嘗試將應用程式「強制關閉」
# 更改 Docker stop_grace_period參數
可以透過 [stop_grace_period](https://docs.docker.com/compose/compose-file/compose-file-v2/)決定從 `SIGTERM`到 `SIGKILl`要等待多久,沒有特別設置的話是 10秒。
Example :
`stop_grace_period : 1s`
or
`stop_grace_period: 1m30s`

# Program.cs新增 shutdown event
以下方法同時支援 SIGTERM 跟 ctrl + c (SIGQUIT) Event
* .Net 6

* .Net 6以下的版本

# Reference
[當 .NET Core 執行在 Linux 或 Docker 容器中如何優雅的結束](https://blog.miniasp.com/post/2020/07/22/How-to-handle-graceful-shutdown-in-NET-Core)