chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何優(yōu)雅地關(guān)閉容器

馬哥Linux運(yùn)維 ? 來源:opskumu.com ? 2023-02-01 09:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

最近把 Docker 官方的 Docker Reference 文檔又讀了一遍,發(fā)現(xiàn)有些細(xì)節(jié)深究起來,還是有很多可挖的。針對寫 Dockerfile ,大部分時候只要照葫蘆畫瓢,基本也不會有什么大的問題,但是如果再深入理解一下那就更有意思了。

要說如何優(yōu)雅的關(guān)閉容器,那就不得不提到信號(Signal)的理念,以及 Dockerfile 中 ENTRYPOINT 和 CMD 指令了。在具體說優(yōu)雅關(guān)閉之前,先了解一下信號這個 Linux 中的基礎(chǔ)概念。

1 信號

信號是事件發(fā)生時對進(jìn)程的通知機(jī)制,有時也稱之為軟件中斷。

信號有不同的類型,Linux 對標(biāo)準(zhǔn)信號的編號為 1~31,可以通過 kill -l 獲取信號名稱:

#kill-l
1)SIGHUP2)SIGINT3)SIGQUIT
4)SIGILL5)SIGTRAP6)SIGABRT
7)SIGBUS8)SIGFPE9)SIGKILL
10)SIGUSR111)SIGSEGV12)SIGUSR2
13)SIGPIPE14)SIGALRM15)SIGTERM
......

實際列出的信號超過了 31 個,有些是其它名稱的同義詞,有些則是定義但未使用的。以下介紹幾個常用的信號:

SIGHUP 當(dāng)終端斷開(掛機(jī))時,將發(fā)送該信號給終端控制進(jìn)程。SIGHUP 信號還可用于守護(hù)進(jìn)程(比如,init 等)。許多守護(hù)進(jìn)程會在收到 SIGHUP 信號時重新進(jìn)行初始化并重讀配置文件。

SIGINT 當(dāng)用戶鍵入終端中斷字符(通常為 Control-C ) 時,終端驅(qū)動程序?qū)l(fā)送該信號給前臺進(jìn)程組。該信號的默認(rèn)行為是終止進(jìn)程。

SIGQUIT 當(dāng)用戶在鍵盤上鍵入退出字符(通常為 Control- )時,該信號將發(fā)往前臺進(jìn)程組。默認(rèn)情況下,該信號終止進(jìn)程,并生成用于調(diào)試的核心轉(zhuǎn)儲文件。進(jìn)程如果陷入無限循環(huán),或者不再響應(yīng)時,使用 SIGQUIT 信號就很合適。

SIGKILL 此信號為 “必殺(sure kill)” 信號,處理器程序無法將其阻塞、忽略或者捕獲,故而 “一擊必殺”,總能終止程序。

SIGTERM 這是用來終止進(jìn)程的標(biāo)準(zhǔn)信號,也是 kill 、 killall 、 pkill 命令所發(fā)送的默認(rèn)信號。精心設(shè)計的應(yīng)用程序應(yīng)當(dāng)為 SIGTERM 信號設(shè)置處理器程序,以便其能夠預(yù)先清除臨時文件和釋放其它資源,從而全身而退。因此,總是應(yīng)該先嘗試使用 SIGTERM 信號來終止進(jìn)程,而把 SIGKILL 作為最后手段,去對付那些不響應(yīng) SIGTERM 信號的失控進(jìn)程。

SIGTSTP 這是作業(yè)控制的停止信號,當(dāng)用戶在鍵盤上輸入掛起字符(通常為 Control-Z )時,將該信號給前臺進(jìn)程組,使其停止運(yùn)行。

值得注意的是, Control-D 不會發(fā)起信號,它表示 EOF(End-Of-File),關(guān)閉標(biāo)準(zhǔn)輸入(stdin)管道(比如可以通過 Control-D 退出當(dāng)前 shell)。如果程序不讀取當(dāng)前輸入的話,是不受 Control-D 影響的。

程序可以針對信號捕捉,然后執(zhí)行相應(yīng)函數(shù):

7234d2c0-a1b2-11ed-bfe3-dac502259ad0.png

以上知識大部分都來自 《Linux/UNIX 系統(tǒng)編程手冊》,想要了解更多的,可以查看該書上冊的 20、21、22 章節(jié)。

2 ENTRYPOINT 、 CMD

可能有人會問,說了半天,那信號和優(yōu)雅的關(guān)閉容器有半毛錢的關(guān)系???話說,這和錢確實沒關(guān)系,但是和如何優(yōu)雅關(guān)閉容器卻關(guān)系密切。

接著說 Dockerfile 中的 ENTRYPOINT 和 CMD 指令,它們的主要功能是指定容器啟動時執(zhí)行的程序。

CMD 有三種格式:

CMD ["executable","param1","param2"] (exec 格式, 推薦使用這種格式)

CMD ["param1","param2"] (作為 ENTRYPOINT 指令參數(shù))

CMD command param1 param2 (shell 格式,默認(rèn) /bin/sh -c )

ENTRYPOINT 有兩種格式:

ENTRYPOINT ["executable", "param1", "param2"] (exec 格式,推薦優(yōu)先使用這種格式)

ENTRYPOINT command param1 param2 (shell 格式)

其中,不管你 Dockerfile 用其中哪個指令,兩個指令都推薦使用 exec 格式,而不是 shell 格式。原因就是因為使用 shell 格式之后,程序會以 /bin/sh -c 的子命令啟動,并且 shell 格式下不會傳遞任何信號給程序。這也就導(dǎo)致,在 docker stop 容器的時候,以這種格式運(yùn)行的程序捕捉不到發(fā)送的信號,也就談不上優(yōu)雅的關(guān)閉了。

?~dockerstop--help

Usage:dockerstop[OPTIONS]CONTAINER[CONTAINER...]

Stoponeormorerunningcontainers

Options:
--helpPrintusage
-t,--timeintSecondstowaitforstopbeforekillingit(default10)

docker stop 停掉容器的時候,默認(rèn)會發(fā)送一個 SIGTERM 的信號,默認(rèn) 10s 后容器沒有停止的話,就 SIGKILL 強(qiáng)制停止容器。通過 -t 選項可以設(shè)置等待時間。

?~dockerkill--help

Usage:dockerkill[OPTIONS]CONTAINER[CONTAINER...]

Killoneormorerunningcontainers

Options:
--helpPrintusage
-s,--signalstringSignaltosendtothecontainer(default"KILL")

通過 docker kill的-s選項還可以指定給容器發(fā)送的信號。

所以,說了那么多,只要 Dockerfile 中通過 exec 格式執(zhí)行容器啟動命令就相安無事了?那當(dāng)然是,沒有那么簡單的了,接下來我們通過實例來看看具體的效果是怎么樣的。

3 實例

通過 Go 寫一個簡單的信號處理器:

?~catsignals.go
packagemain

import(
"fmt"
"os"
"os/signal"
"syscall"
)

funcmain(){
sigs:=make(chanos.Signal,1)
done:=make(chanbool,1)

signal.Notify(sigs,syscall.SIGINT,syscall.SIGTERM)

gofunc(){
sig:=<-sigs
????????fmt.Println()
????????fmt.Println(sig)
????????done?<-?true
????}()

????fmt.Println("awaiting?signal")
????<-done
????fmt.Println("exiting")
}

3.1 實例 1

?~GOOS=linuxGOARCH=amd64gobuildsignals.go
?~ls
Dockerfilesignalssignals.go
?~catDockerfile
FROMbusybox

COPYsignals/signals

CMD["/signals"]#exec格式執(zhí)行
?~dockerbuild-tsignals.

通過 tmux 開啟兩個面板,一個運(yùn)行容器,一個執(zhí)行 docker stop :

?~dockerrun-it--rm--namesignalssignals
awaitingsignal

terminated
exiting
?~timedockerstopsignals
signals
dockerstopsignals0.01suser0.02ssystem4%cpu0.732total
?~

可以發(fā)現(xiàn),容器停止之前,程序接收到信號并輸出相應(yīng)信息,并且停止總耗時為 0.732 s,達(dá)到了優(yōu)雅的效果。

修改 Dockerfile 中 CMD 執(zhí)行格式,執(zhí)行相同操作:

?~catDockerfile
FROMbusybox

COPYsignals/signals

CMD/signals#shell格式執(zhí)行
?~dockerbuild-tsignals.
?~dockerrun-it--rm--namesignalssignals
awaitingsignal
?~
?~timedockerstopsignals
signals
dockerstopsignals0.01suser0.01ssystem0%cpu10.719total

通過 shell 格式之后,可以發(fā)現(xiàn)容器停止之前,程序并未接收到任何信號,并且停止時間為 10.719s,說明該容器是被強(qiáng)制停止的。

結(jié)論很明顯,為了優(yōu)雅的退出容器,我們應(yīng)該采用 exec 這種格式。

3.2 實例 2

通過實例 1 我們都會在 Dockerfile 中都會通過 exec 這種格式來執(zhí)行程序了,那如果執(zhí)行的程序本身也是一個 shell 腳本呢?

?~ls
Dockerfilesignalssignals.gostart.sh
?~catDockerfile
FROMbusybox

COPYsignals/signals
COPYstart.sh/start.sh#引入shell腳本啟動

CMD["/start.sh"]
?~catstart.sh
#!/bin/sh

/signals
?~

測試依然引用實例 1 中的方法:

?~dockerrun-it--rm--namesignalssignals
awaitingsignal
?~
?~timedockerstopsignals
signals
dockerstopsignals0.01suser0.02ssystem0%cpu10.765total
?~

可以發(fā)現(xiàn),即使 Dockerfile 中的 CMD 指令使用的是 exec 格式,容器中的程序依然沒有接收到信號,最后被強(qiáng)制關(guān)閉。因為 shell 腳本中執(zhí)行的原因,導(dǎo)致信號依然沒有被傳遞,我們需要針對 shell 腳本做一些改造:

?~catstart.sh
#!/bin/sh

exec/signals#加入exec執(zhí)行
?~dockerbuild-tsignals.
?~dockerrun-it--rm--namesignalssignals
awaitingsignal

terminated
exiting
?~timedockerstopsignals
signals
dockerstopsignals0.02suser0.02ssystem4%cpu0.744total
?~

可以看到,加入 exec 命令之后,程序又可以接收到信號正常退出了。當(dāng)然,如果你 Dockerfile 中的 CMD 是以 shell 格式運(yùn)行的,即使啟動腳本中加入 exec 也是無效的。再者,如果你的程序本身不能針對信號做一些處理,也就談不上優(yōu)雅關(guān)閉了。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11509

    瀏覽量

    213674
  • 信號
    +關(guān)注

    關(guān)注

    11

    文章

    2851

    瀏覽量

    78241
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    511

    瀏覽量

    22445
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    737

    瀏覽量

    22869
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    515

    瀏覽量

    12943

原文標(biāo)題:如何優(yōu)雅地關(guān)閉容器

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    200.200 尚硅谷 SparkStreaming 優(yōu)雅關(guān)閉 恢復(fù)數(shù)據(jù)

    數(shù)據(jù)庫
    充八萬
    發(fā)布于 :2023年07月18日 09:25:47

    神舟優(yōu)雅U10R上網(wǎng)本 參考價格:2499元

    推薦產(chǎn)品:神舟優(yōu)雅U10R上網(wǎng)本  參考價格:2499元神舟 優(yōu)雅U10R神舟 優(yōu)雅U10R僅重1.15kg 輕盈生活隨處可得   優(yōu)雅U10R采用10.1寸超輕薄靚麗LED
    發(fā)表于 07-01 22:30

    熱門低價3G上網(wǎng)本推薦 神舟優(yōu)雅U20Y 參考售價:2399元

    獲得了補(bǔ)貼,含上網(wǎng)自費(fèi)套餐的3G上網(wǎng)本價格上并不比沒有3G功能的上網(wǎng)本高。因此在有補(bǔ)貼的情況,今年購買還是比較劃算的。下面我們就一起看看具體的情況?! ∩裰?b class='flag-5'>優(yōu)雅U20Y  參考售價:2399元(不含
    發(fā)表于 07-02 09:03

    Spark Streaming的offset管理和關(guān)閉策略

    Spark Streaming優(yōu)雅關(guān)閉策略優(yōu)化
    發(fā)表于 04-22 14:59

    如何優(yōu)雅地完成倒計時定時器自適應(yīng)顯示呢

    如何實現(xiàn)倒計時的基本功能呢?如何優(yōu)雅地完成倒計時定時器自適應(yīng)顯示呢?
    發(fā)表于 10-27 07:15

    磁通電容器的資料分享

    更多的絲印藝術(shù)。再次感謝 pcb 方式,一塊板已完全組裝,我編寫了代碼讓燈閃爍以模仿通量電容器動畫。該按鈕目前沒有做任何事情,但我打算用它來打開和關(guān)閉 LED,或者啟用其他類型的動畫。 LED 在日光下非常明亮,并具有溫暖的黃色/橙色。PCB
    發(fā)表于 07-13 07:50

    利用golang優(yōu)雅的實現(xiàn)單實例分享

    1、利用golang優(yōu)雅的實現(xiàn)單實例平時編寫代碼過程中,經(jīng)常會遇到對于全局角度只需運(yùn)行一次的代碼,比如全局初始化操作,設(shè)計模式中的單例模式。針對單例模式,java中又出現(xiàn)了餓漢模式、懶漢模式,再配
    發(fā)表于 10-17 16:46

    經(jīng)驗分享|BI數(shù)據(jù)可視化報表布局——容器

    設(shè)置。2、放大容器點擊右側(cè)的【專有】,將看到一個【允許放大容器】的開關(guān)。這是一個什么功能?關(guān)閉該開關(guān),表示可以放大容器以及容器內(nèi)的圖表;開啟
    發(fā)表于 03-15 17:10

    如何通過ESP模塊打開/關(guān)閉樹莓派GPIO電路?

    如何通過ESP模塊打開/關(guān)閉樹莓派GPIO電路?樹莓派作為優(yōu)雅的電源開/關(guān)功能。您只需關(guān)閉 Pi Pin 5 (BCM 3) GPIO 到 GND。只要您在 Pi OS 中完成了一些軟件配置,這就
    發(fā)表于 05-15 06:13

    華為nfc怎么關(guān)閉

    華為手機(jī)的NFC功能默認(rèn)的是開啟,如果不喜歡,可以選擇關(guān)閉。華為nfc關(guān)閉的步驟的如下:
    的頭像 發(fā)表于 02-28 14:02 ?6.7w次閱讀

    容器充電和放電的工作原理

    容器剛接入電路(本來不帶電),開關(guān)閉合,充電,一會兒后由不帶電量變得帶電。
    發(fā)表于 06-22 09:45 ?1.6w次閱讀

    單片機(jī)優(yōu)雅的開發(fā)Clion環(huán)境搭建

    單片機(jī)優(yōu)雅的開發(fā)Clion環(huán)境搭建
    發(fā)表于 11-13 12:21 ?20次下載
    單片機(jī)<b class='flag-5'>優(yōu)雅</b>的開發(fā)Clion環(huán)境搭建

    Tokio 模塊的優(yōu)雅停機(jī)機(jī)制

    在進(jìn)行高并發(fā)、網(wǎng)絡(luò)編程時,優(yōu)雅停機(jī)是一個非常重要的問題。在 Rust 語言中,Tokio 是一個非常流行的異步編程框架,它提供了一些優(yōu)雅停機(jī)的機(jī)制,本文將圍繞 Tokio 模塊的優(yōu)雅停機(jī)進(jìn)行詳細(xì)
    的頭像 發(fā)表于 09-19 15:26 ?959次閱讀

    linux關(guān)閉docker的命令

    在 Linux 系統(tǒng)中,關(guān)閉 Docker 的操作可以通過以下多種方式進(jìn)行。本文將詳細(xì)講解每一種方式,并提供示例代碼和命令,以幫助讀者更好地理解和實踐。 使用 docker 命令 最常用的方法
    的頭像 發(fā)表于 11-23 09:39 ?3587次閱讀

    優(yōu)雅停機(jī)是什么?SpringBoot+Nacos+k8s實現(xiàn)優(yōu)雅停機(jī)

    優(yōu)雅停機(jī)是什么?網(wǎng)上說的優(yōu)雅下線、無損下線,都是一個意思。
    的頭像 發(fā)表于 02-20 10:00 ?2754次閱讀
    <b class='flag-5'>優(yōu)雅</b>停機(jī)是什么?SpringBoot+Nacos+k8s實現(xiàn)<b class='flag-5'>優(yōu)雅</b>停機(jī)