<em id="hanht"></em>

    <dd id="hanht"></dd>

    <em id="hanht"><acronym id="hanht"></acronym></em>
    
    <button id="hanht"></button>
    <rp id="hanht"><object id="hanht"><blockquote id="hanht"></blockquote></object></rp><em id="hanht"></em>

    首頁 > 學院 > 系統知識 > 正文

    怎樣優雅的關閉容器,看本文就夠了

    2022-07-09 12:57:43
    字體:
    來源:轉載
    供稿:網友
    1 信號
    信號是事件發生時對進程的通知機制,有時也稱之為軟件中斷。
     
    信號有不同的類型,Linux 對標準信號的編號為 1~31,可以通過 kill -l 獲取信號名稱:
     
    # kill -l  
     1) SIGHUP       2) SIGINT       3) SIGQUIT     
     4) SIGILL       5) SIGTRAP      6) SIGABRT    
     7) SIGBUS       8) SIGFPE       9) SIGKILL
     10) SIGUSR1    11) SIGSEGV     12) SIGUSR2
     13) SIGPIPE    14) SIGALRM     15) SIGTERM
    ... ...
    實際列出的信號超過了 31 個,有些是其它名稱的同義詞,有些則是定義但未使用的。以下介紹幾個常用的信號:
     
     1) SIGHUP 當終端斷開(掛機)時,將發送該信號給終端控制進程。SIGHUP 信號還可用于守護進程(比如,init 等)。許多守護進程會在收到 SIGHUP 信號時重新進行初始化并重讀配置文件。
     2) SIGINT 當用戶鍵入終端中斷字符(通常為 Control-C ) 時,終端驅動程序將發送該信號給前臺進程組。該信號的默認行為是終止進程。
     3) SIGQUIT 當用戶在鍵盤上鍵入退出字符(通常為 Control-/ )時,該信號將發往前臺進程組。默認情況下,該信號終止進程,并生成用于調試的核心轉儲文件。進程如果陷入無限循環,或者不再響應時,使用 SIGQUIT 信號就很合適。
     9) SIGKILL 此信號為 “必殺(sure kill)” 信號,處理器程序無法將其阻塞、忽略或者捕獲,故而 “一擊必殺”,總能終止程序。
     15) SIGTERM 這是用來終止進程的標準信號,也是 kill 、 killall 、 pkill 命令所發送的默認信號。精心設計的應用程序應當為 SIGTERM 信號設置處理器程序,以便其能夠預先清除臨時文件和釋放其它資源,從而全身而退。因此,總是應該先嘗試使用 SIGTERM 信號來終止進程,而把 SIGKILL 作為最后手段,去對付那些不響應 SIGTERM 信號的失控進程。
     20) SIGTSTP 這是作業控制的停止信號,當用戶在鍵盤上輸入掛起字符(通常為 Control-Z )時,將該信號給前臺進程組,使其停止運行。
    值得注意的是, Control-D 不會發起信號,它表示 EOF(End-Of-File),關閉標準輸入(stdin)管道(比如可以通過 Control-D 退出當前 shell)。如果程序不讀取當前輸入的話,是不受 Control-D 影響的。
    2 ENTRYPOINT 、 CMD
    可能有人會問,說了半天,那信號和優雅的關閉容器有半毛錢的關系???話說,這和錢確實沒關系,但是和如何優雅關閉容器卻關系密切。
     
    接著說 Dockerfile 中的 ENTRYPOINT 和 CMD 指令,它們的主要功能是指定容器啟動時執行的程序。
     
    CMD 有三種格式:
     
     CMD ["executable","param1","param2"] (exec 格式, 推薦使用這種格式)
     CMD ["param1","param2"] (作為 ENTRYPOINT 指令參數)
     CMD command param1 param2 (shell 格式,默認 /bin/sh -c )
    ENTRYPOINT 有兩種格式:
     
     ENTRYPOINT ["executable", "param1", "param2"] (exec 格式,推薦優先使用這種格式)
     ENTRYPOINT command param1 param2 (shell 格式)
    其中,不管你 Dockerfile 用其中哪個指令,兩個指令都推薦使用 exec 格式,而不是 shell 格式。原因就是因為使用 shell 格式之后,程序會以 /bin/sh -c 的子命令啟動,并且 shell 格式下不會傳遞任何信號給程序。這也就導致,在 docker stop 容器的時候,以這種格式運行的程序捕捉不到發送的信號,也就談不上優雅的關閉了。
     
    ➜  ~ docker stop --help  
    Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]  
    Stop one or more running containers  
    Options:  
          --help       Print usage  
      -t, --time int   Seconds to wait for stop before killing it (default 10)
    docker stop 停掉容器的時候,默認會發送一個 SIGTERM 的信號,默認 10s 后容器沒有停止的話,就 SIGKILL 強制停止容器。通過 -t 選項可以設置等待時間。
     
    ➜  ~ docker kill --help  
    Usage:  docker kill [OPTIONS] CONTAINER [CONTAINER...]  
    Kill one or more running containers  
    Options:  
          --help            Print usage  
      -s, --signal string   Signal to send to the container (default "KILL")
    通過 docker kill 的 -s 選項還可以指定給容器發送的信號。
     
    所以,說了那么多,只要 Dockerfile 中通過 exec 格式執行容器啟動命令就相安無事了?那當然是,沒有那么簡單的了,接下來我們通過實例來看看具體的效果是怎么樣的。2 ENTRYPOINT 、 CMD
    可能有人會問,說了半天,那信號和優雅的關閉容器有半毛錢的關系???話說,這和錢確實沒關系,但是和如何優雅關閉容器卻關系密切。
     
    接著說 Dockerfile 中的 ENTRYPOINT 和 CMD 指令,它們的主要功能是指定容器啟動時執行的程序。
     
    CMD 有三種格式:
     
     CMD ["executable","param1","param2"] (exec 格式, 推薦使用這種格式)
     CMD ["param1","param2"] (作為 ENTRYPOINT 指令參數)
     CMD command param1 param2 (shell 格式,默認 /bin/sh -c )
    ENTRYPOINT 有兩種格式:
     
     ENTRYPOINT ["executable", "param1", "param2"] (exec 格式,推薦優先使用這種格式)
     ENTRYPOINT command param1 param2 (shell 格式)
    其中,不管你 Dockerfile 用其中哪個指令,兩個指令都推薦使用 exec 格式,而不是 shell 格式。原因就是因為使用 shell 格式之后,程序會以 /bin/sh -c 的子命令啟動,并且 shell 格式下不會傳遞任何信號給程序。這也就導致,在 docker stop 容器的時候,以這種格式運行的程序捕捉不到發送的信號,也就談不上優雅的關閉了。
     
    ➜  ~ docker stop --help  
    Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]  
    Stop one or more running containers  
    Options:  
          --help       Print usage  
      -t, --time int   Seconds to wait for stop before killing it (default 10)
    docker stop 停掉容器的時候,默認會發送一個 SIGTERM 的信號,默認 10s 后容器沒有停止的話,就 SIGKILL 強制停止容器。通過 -t 選項可以設置等待時間。
     
    ➜  ~ docker kill --help  
    Usage:  docker kill [OPTIONS] CONTAINER [CONTAINER...]  
    Kill one or more running containers  
    Options:  
          --help            Print usage  
      -s, --signal string   Signal to send to the container (default "KILL")
    通過 docker kill 的 -s 選項還可以指定給容器發送的信號。
     
    所以,說了那么多,只要 Dockerfile 中通過 exec 格式執行容器啟動命令就相安無事了?那當然是,沒有那么簡單的了,接下來我們通過實例來看看具體的效果是怎么樣的。

    (編輯:錯新網)

    發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    一级特黄大片欧美久久久久_一本一道久久综合狠狠老_JLZZ日本人年轻护士_欧美男男作爱VIDEOS可播放
      <em id="hanht"></em>

      <dd id="hanht"></dd>

      <em id="hanht"><acronym id="hanht"></acronym></em>
      
      <button id="hanht"></button>
      <rp id="hanht"><object id="hanht"><blockquote id="hanht"></blockquote></object></rp><em id="hanht"></em>