欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

如何關(guān)閉容器

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

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

docker 的設(shè)計(jì)者自然不會(huì)平白無(wú)故的設(shè)計(jì)三種命令組合來(lái)做關(guān)閉容器這件事,三種方式都應(yīng)該在什么場(chǎng)景下被使用呢?

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

進(jìn)程與信號(hào)

用戶是可以通過(guò)發(fā)送信號(hào),來(lái)和進(jìn)程通信的。

基本上每一個(gè)運(yùn)維工程師都執(zhí)行過(guò)如下命令來(lái)殺死一個(gè)進(jìn)程:

kill -9 PID

這個(gè)命令看起來(lái)恰如其分,我 "殺死" 了一個(gè)進(jìn)程,但是,為什么是 "-9" ?

9 是信號(hào) SIGKILL 的代號(hào),上述命令實(shí)際上是向?qū)?yīng)的進(jìn)程發(fā)送了一個(gè)信號(hào),一個(gè)可以殺死進(jìn)程的信號(hào)。

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

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

我無(wú)意去詳解每一個(gè)信號(hào)的意義,我的功力還差得遠(yuǎn),在這里只揀取和我們主題相關(guān)的知識(shí)來(lái)進(jìn)行闡述。

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

信號(hào)名稱 代號(hào) 可否被捕獲或忽略
SIGTERM 15 可以
SIGKILL 9 不可以

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

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

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

容器與信號(hào)

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

  • docker stop

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

Docker 手冊(cè)原文如下:

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

  • docker rm -f

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

  • docker kill

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

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

接下來(lái)終于要進(jìn)入正題了。

捕獲信號(hào)并處理

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

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

root@ubuntuserver:~# trap --help

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

? ? Trap signals and other events.

其基本的使用方式如下:

trap do_some_things SIGSPEC

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

以下是一個(gè)腳本示例,這個(gè)腳本被作為容器的入口(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 

容器啟動(dòng)后,從其他終端執(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) ??

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

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

相關(guān)文章

  • docker搭建xxl-job的實(shí)現(xiàn)步驟

    docker搭建xxl-job的實(shí)現(xiàn)步驟

    XXL-JOB是一個(gè)輕量級(jí)分布式任務(wù)調(diào)度平臺(tái),通過(guò)xxljob,我們可以方便地實(shí)現(xiàn)任務(wù)調(diào)度和任務(wù)執(zhí)行監(jiān)控,本文介紹了docker搭建xxl-job的實(shí)現(xiàn)步驟,感興趣的可以了解一下
    2023-12-12
  • 詳解docker?API管理接口增加CA安全認(rèn)證

    詳解docker?API管理接口增加CA安全認(rèn)證

    這篇文章主要介紹了docker?API管理接口增加CA安全認(rèn)證,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • docker容器配置啟動(dòng)參數(shù)

    docker容器配置啟動(dòng)參數(shù)

    通過(guò)添加參數(shù),我們可以在啟動(dòng) Docker 容器時(shí)靈活地配置容器的行為,本文介紹了通過(guò)命令行和 Dockerfile 兩種方式添加參數(shù)的方法,并給出了常用參數(shù)的示例,希望本文能幫助您理解如何在 Docker 啟動(dòng)時(shí)添加參數(shù),并正確地配置和管理 Docker容器
    2023-10-10
  • Docker部署Nuxt.js項(xiàng)目的實(shí)現(xiàn)

    Docker部署Nuxt.js項(xiàng)目的實(shí)現(xiàn)

    這篇文章主要介紹了Docker部署Nuxt.js項(xiàng)目的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 詳解docker進(jìn)行數(shù)據(jù)掛載的三種模式

    詳解docker進(jìn)行數(shù)據(jù)掛載的三種模式

    Docker?提供了三種方式將數(shù)據(jù)從宿主機(jī)掛載到?Docker容器中:?volumes、bind?mounts、tmpfs?,這篇文章主要介紹了docker進(jìn)行數(shù)據(jù)掛載的三種模式,需要的朋友可以參考下
    2022-05-05
  • Docker?Compose構(gòu)建Jenkins的實(shí)現(xiàn)

    Docker?Compose構(gòu)建Jenkins的實(shí)現(xiàn)

    本文主要介紹了Docker?Compose構(gòu)建Jenkins的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 簡(jiǎn)單談?wù)凞ocker鏡像的使用方法

    簡(jiǎn)單談?wù)凞ocker鏡像的使用方法

    本次分享從個(gè)人的角度,講述對(duì)于Docker鏡像的使用方法,包括了從從Docker Hub或者其他鏡像源安裝Docker鏡像,從Image file安裝Docker鏡像,從Docker file制作Docker鏡像,有需要的小伙伴可以參考下
    2016-10-10
  • docker+nextcloud搭建個(gè)人云存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)

    docker+nextcloud搭建個(gè)人云存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要介紹了docker+nextcloud搭建個(gè)人云存儲(chǔ)系統(tǒng)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • docker images導(dǎo)入導(dǎo)出方式

    docker images導(dǎo)入導(dǎo)出方式

    這篇文章主要介紹了docker images導(dǎo)入導(dǎo)出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • docker-compose部署zabbix+grafana的實(shí)現(xiàn)

    docker-compose部署zabbix+grafana的實(shí)現(xiàn)

    這篇文章主要介紹了docker-compose部署zabbix+grafana的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11

最新評(píng)論