最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用?trap?在?docker?容器優(yōu)雅關(guān)閉前執(zhí)行環(huán)境清理的方案

 更新時間:2021年12月17日 11:11:34   作者:DrunkCat90  
這篇文章主要介紹了利用?trap?在?docker?容器優(yōu)雅關(guān)閉前執(zhí)行環(huán)境清理的問題,需要在容器的啟動腳本中,加入 trap 指令,來完成容器在退出前需要做的所有事情,本文通過腳本示例給大家介紹的非常詳細,需要的朋友參考下吧

當一個運行中的容器被終止時,如何能夠執(zhí)行一些預定義的操作,比如在容器徹底退出之前清理環(huán)境。這是一種類似于 pre stop 的鉤子體驗。但 docker 本身無法提供這種能力,本文結(jié)合 Linux 內(nèi)置命令 trap ,實現(xiàn)在容器優(yōu)雅關(guān)閉之前,可以執(zhí)行自定義的操作。

當一個運行中的容器被終止時,如何能夠執(zhí)行一些預定義的操作,比如在容器徹底退出之前清理環(huán)境。這是一種類似于 pre stop 的鉤子體驗。但 docker 本身無法提供這種能力,本文結(jié)合 Linux 內(nèi)置命令 trap ,實現(xiàn)在容器優(yōu)雅關(guān)閉之前,可以執(zhí)行自定義的操作。

如何關(guān)閉容器

我了解有三種方式可以關(guān)閉一個正在運行中的容器,三者都是由 docker 命令行發(fā)起的。

  • 第一種是較為優(yōu)雅的方式 docker stop ContainerID
  • 第二種看起來就比較武斷 docker rm -f ContainerID
  • 第三種用的人會少很多 docker kill --signal=KILL ContainerID

docker 的設計者自然不會平白無故的設計三種命令組合來做關(guān)閉容器這件事,三種方式都應該在什么場景下被使用呢?

這三種終止容器的方式之間是略有不同的,在講解這些不同之前,需要提及一些看似和容器不相關(guān)的知識點——SIGNAL 。

進程與信號

用戶是可以通過發(fā)送信號,來和進程通信的。

基本上每一個運維工程師都執(zhí)行過如下命令來殺死一個進程:

kill -9 PID

這個命令看起來恰如其分,我 "殺死" 了一個進程,但是,為什么是 "-9" ?

9 是信號 SIGKILL 的代號,上述命令實際上是向?qū)倪M程發(fā)送了一個信號,一個可以殺死進程的信號。

kill 命令的真正意義,是向進程發(fā)送指定的信號,除了SIGKILL(9) 之外,還可以發(fā)送其他多種信號:

root@ubuntuserver:~# kill --help

kill: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

? ? Send a signal to a job.

root@ubuntuserver:~# 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

16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP

21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ

26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR

31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3

38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8

43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13

48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12

53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7

58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2

63) SIGRTMAX-1 64) SIGRTMAX

我無意去詳解每一個信號的意義,我的功力還差得遠,在這里只揀取和我們主題相關(guān)的知識來進行闡述。

有兩個信號和我們的主題相關(guān), SIGTERM. SIGKILL

信號名稱 代號 可否被捕獲或忽略
SIGTERM 15 可以
SIGKILL 9 不可以

SIGTERMkill 命令默認發(fā)送的信號。當用戶請求終止進程時,會產(chǎn)生SIGTERM信號。SIGTERM信號可以被捕獲或無視。這允許該進程在結(jié)束前釋放掉所占用的資源并保存其狀態(tài)。

SIGKILL 發(fā)送SIGKILL信號到一個進程可以使其立即終止(KILL)。與SIGTERM不同的是,這個信號不能被捕獲或忽略,接收過程在接收到這個信號時不能執(zhí)行任何清理。但有時候 kill -9 并非一定可以殺死進程,釋放資源。還是有一些特殊情況:

  • 僵尸進程不能被殺死,因為它們已經(jīng)死了,正在等待它們的父進程來收獲它們。
  • 處于阻塞狀態(tài)的進程不會死亡,直到它們再次醒來init 進程是特殊的:
  • init不接收任何它不打算處理的信號,因此它會忽略SIGKILL。這條規(guī)則有一個例外,Linux 上的 init 如果被 ptrace 了,那么它是可以接收 SIGKILL 并被殺死的。
  • 處于不可中斷的睡眠的進程即使發(fā)送了SIGKILL,也有可能不會終止(并釋放其資源)。這是少數(shù) Unix 系統(tǒng)必須重新啟動才能解決臨時軟件問題的幾種情況之一。

容器與信號

容器的本質(zhì),是一組被封裝起來的進程。所以通過開頭講到的三種命令行方式關(guān)閉一個運行中的容器,其本質(zhì)也是在通過發(fā)送信號的方式與容器中的進程進行交互,使之被 "殺死" 的過程。

  • docker stop

執(zhí)行 docker stop ContainerID ,會向容器中的主進程先發(fā)送一個 SIGTERM 信號,在一段時間的寬限期后,發(fā)送 SIGKILL 信號徹底殺死容器。

Docker 手冊原文如下:

The main process inside the container will receive SIGTERM, and after a grace period, SIGKILL

  • docker rm -f

執(zhí)行 docker rm -f ContainerID ,會向容器中的主進程直接發(fā)送SIGKILL 信號,在容器殺死之后,也會把容器刪除掉。從刪除容器這個操作看來,這個命令是用來刪除一個已停止的容器,而非用于停止運行中的容器。

  • docker kill

執(zhí)行 docker kill --signal=KILL ContainerID ,是專門向容器主進程發(fā)送各種自定義信號的方式。換言之,它就是面向容器的 kill 命令。當前命令是在向容器主進程發(fā)送一個 SIGKILL 信號。

通過比對,docker rm -f ContainerID 這種方式是不應該用于停止運行中容器的。而剩余兩種方式之間, docker stop ContainerID 也明顯要優(yōu)雅一些,它既可以保證容器會被最終殺死,也會提供 SIGTERM 供用戶后續(xù)捕獲處理。

接下來終于要進入正題了。

捕獲信號并處理

信號 SIGTERM 是一種可以被捕獲的信號。當容器主進程捕獲到這個信號之后,可以觸發(fā)事先設計好的邏輯,在徹底退出之前完成預定的任務。比如可以執(zhí)行環(huán)境的清理、數(shù)據(jù)的保存、關(guān)閉其他不受主進程控制的進程等等。在某些場景下,這種需求非常突出。

Linux 提供內(nèi)置的 trap 命令,負責捕獲信號,并確保在進程徹底退出前,執(zhí)行某些任務。

root@ubuntuserver:~# trap --help

trap: trap [-lp] [[arg] signal_spec ...]

? ? Trap signals and other events.

其基本的使用方式如下:

trap do_some_things SIGSPEC

思路已經(jīng)清晰了,我們需要在容器的啟動腳本中,加入 trap 指令,來完成容器在退出前需要做的所有事情。

以下是一個腳本示例,這個腳本被作為容器的入口(ENTRYPOINT)執(zhí)行。

#!/bin/bash

function clean_up_term {
  rm -rf /data/tmp
  echo "clean_up_term in execution"
}

trap clean_up_term SIGTERM

for ((i=1;i<=1000;i++))
  do
    echo "Wait for $i"
    sleep 1
  done 

容器啟動后,從其他終端執(zhí)行了 docker stop ContainerID 命令,可以觀察到以下結(jié)果。

guox@MacBook-Pro-For-Guox: /Users/guox/GitHub/test-plugin git:(master) ??

?? ?docker run -ti --name=clean -v $(pwd)/data:/data clean?

Wait for 1

Wait for 2

Wait for 3

Wait for 4

Wait for 5

Wait for 6

Wait for 7

Wait for 8

Wait for 9

Wait for 10

Wait for 11

Wait for 12

Wait for 13

clean_up_term in execution

Wait for 14

Wait for 15

Wait for 16

Wait for 17

Wait for 18

Wait for 19

Wait for 20

Wait for 21

Wait for 22

Wait for 23

guox@MacBook-Pro-For-Guox: /Users/guox/GitHub/test-plugin git:(master) ??

信號 SIGTERM 的確被容器捕獲,并進行了相關(guān)的清理操作。 docker stop ContainerID 提供了一段寬限期,所以在執(zhí)行了清理操作后,容器主進程還是繼續(xù)執(zhí)行了一會才退出。

到此這篇關(guān)于利用?trap?在?docker?容器優(yōu)雅關(guān)閉前執(zhí)行環(huán)境清理的文章就介紹到這了,更多相關(guān)docker?容器執(zhí)行環(huán)境清理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Docker容器內(nèi)部無法解析域名問題的解決

    關(guān)于Docker容器內(nèi)部無法解析域名問題的解決

    最近工作中遇到一個問題,項目內(nèi)部需要訪問外網(wǎng),但上傳文件,但是一直報unknown host,無法解析域名,所以下面這篇文章主要給大家介紹了關(guān)于Docker容器內(nèi)部無法解析域名問題的解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • docker registry 鏡像同步的實現(xiàn)思路

    docker registry 鏡像同步的實現(xiàn)思路

    這篇文章主要介紹了docker registry 鏡像同步的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 基于windows10安裝docker及遇到的問題

    基于windows10安裝docker及遇到的問題

    這篇文章主要介紹了基于windows10安裝docker及遇到的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 如何使用Docker部署FTP和Nginx并通過HTTP訪問FTP里的文件

    如何使用Docker部署FTP和Nginx并通過HTTP訪問FTP里的文件

    本文介紹了如何使用Docker部署FTP服務器和Nginx,并通過HTTP訪問FTP中的文件,通過將FTP數(shù)據(jù)目錄掛載到Nginx容器內(nèi),Nginx可以提供文件列表和下載功能,推薦使用Docker Compose來管理容器
    2025-03-03
  • Docker超詳細講解鏡像操作

    Docker超詳細講解鏡像操作

    鏡像也是?docker?的核心組件之一,鏡像時容器運行的基礎,容器是鏡像運行后的形態(tài)。本文主要介紹Docker鏡像的基本操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • docker部署xxl-job-admin出現(xiàn)數(shù)據(jù)庫拒絕問題及解決方法

    docker部署xxl-job-admin出現(xiàn)數(shù)據(jù)庫拒絕問題及解決方法

    這篇文章主要介紹了docker部署xxl-job-admin出現(xiàn)數(shù)據(jù)庫拒絕問題,本文給大家分享正確的解決思路,對docker部署xxl-job-admin相關(guān)知識感興趣的朋友一起看看吧
    2023-02-02
  • docker運行nginx容器并掛載數(shù)據(jù)卷

    docker運行nginx容器并掛載數(shù)據(jù)卷

    本文主要介紹了docker運行nginx容器,并通過掛載目錄將容器與宿主機的數(shù)據(jù)進行共享和統(tǒng)一管理,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • 告別Docker請求超時之一步步排查與詳細解決方案

    告別Docker請求超時之一步步排查與詳細解決方案

    在Ubuntu系統(tǒng)上安裝Docker后,運行docker?run?hello-world時遇到連接超時問題,下面這篇文章主要介紹了Docker請求超時一步步排查與詳細解決方案的相關(guān)資料,需要的朋友可以參考下
    2025-02-02
  • Docker 命令教程(附中文解釋)

    Docker 命令教程(附中文解釋)

    這篇文章主要介紹了Docker 命令教程的相關(guān)資料,在學習Docker的過程中,特地把所以命令實驗了一番并整理,希望大家盡快掌握此部分的知識,有需要的小伙伴可以參考下
    2016-10-10
  • 使用docker-compose實現(xiàn)不停機部署/灰度發(fā)布的四種方法

    使用docker-compose實現(xiàn)不停機部署/灰度發(fā)布的四種方法

    灰度發(fā)布是一種軟件部署策略,它允許將新版本的部分功能或服務逐步推送給用戶,而不是一次性對所有用戶進行大規(guī)模更新,本文主要給大家介紹了使用docker-compose實現(xiàn)不停機部署/灰度發(fā)布的四種方法,需要的朋友可以參考下
    2024-11-11

最新評論

千阳县| 瑞丽市| 慈利县| 阳山县| 保亭| 常熟市| 公主岭市| 黄龙县| 兴化市| 清丰县| 无棣县| 宁远县| 浠水县| 德江县| 刚察县| 华池县| 大埔区| 淮安市| 小金县| 繁峙县| 彰化县| 夏河县| 隆子县| 清原| 年辖:市辖区| 康马县| 宝兴县| 永修县| 武强县| 拉萨市| 新昌县| 望都县| 秦皇岛市| 蓬安县| 惠州市| 安泽县| 中江县| 高唐县| 新沂市| 惠水县| 镇平县|