簡體   English   中英

交互式 docker 容器停止

[英]Interactive docker container stop

我正在使用 docker container stop 來停止容器。 它向子進程發送 SIGTERM 信號,子進程可能需要一些時間才能完成,然后才能退出。

所以,我的 docker container stop 正在等待子進程完成。 但我無法知道它為什么要等待。 有沒有辦法以“交互”模式或其他一些 docker 解決方案運行 docker container stop,這將告訴我等待退出的主要進程是什么?

附加信息:使用 Hangfire 啟動這些作業並監控這些作業。

Docker 容器停止文檔沒有列出任何方法。

我想到的一個潛在解決方案?:我有辦法知道在 docker 中運行的主應用程序的進程 ID。 我們能否以某種方式將該信息傳輸到一個文件,我可以在 docker 停止工作時同時讀取該文件。

您不能按照日志並使用相同的命令停止容器。 您可以在另一個選項卡中關閉容器的同時關注其他終端選項卡中的日志。因此它將向您顯示該容器的詳細日志。這是一個示例:

在這里我有兩個終端窗口,我正在用命令停止容器

docker stop f76

在另一個中,我正在關注日志

docker logs --follow f76

docker logs 並在兩個選項卡中停止

停止容器時,日志打印這些行:

1:signal-handler (1671521182) Received SIGTERM scheduling shutdown...
1:M 20 Dec 2022 07:26:22.689 # User requested shutdown...
1:M 20 Dec 2022 07:26:22.689 * Saving the final RDB snapshot before exiting.
1:M 20 Dec 2022 07:26:22.704 * DB saved on disk
1:M 20 Dec 2022 07:26:22.704 # Redis is now ready to exit, bye bye...

碼頭工人停止日志

因此,我可以知道我的容器中發生了什么,或者它在停止時正在等待什么。

docker stop只管理容器內 pid 為 1 的進程,沒有其他任何東西; Docker 在等待時無法顯示更多內容。

一個 Docker 容器通常只運行一個進程。 在這種情況下,機制很明確:Docker 向該進程發送 SIGTERM,等待它退出,最后發送 SIGKILL。

如果您以某種方式讓您的容器設置為運行多個進程,那么在進程樹的根部會有一個進程 ID 為 1 的進程。根據您的設置,這可能是 supervisord、shell 或其他進程。 docker stop只向這個單根進程發送SIGTERM,超時后,如果這個單根進程還沒有退出,它會用SIGKILL 強行終止那個進程。 清理序列還將終止可能碰巧存在的任何子進程,我相信會立即且不太禮貌。

因此,“交互式docker stop ”可以寫的東西不多。 它立即發送 SIGTERM,如果沒有立即返回,則表示該進程已經處理了該信號,尚未退出。 此時,Docker 本身只是以一種可以監控的方式等待。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM