亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

詳解如何在 docker 容器中捕獲信號

2024-09-01 13:53:04
字體:
來源:轉載
供稿:網友

我們可能都使用過 docker stop 命令來停止正在運行的容器,有時可能會使用 docker kill 命令強行關閉容器或者把某個信號傳遞給容器中的進程。這些操作的本質都是通過從主機向容器發送信號實現主機與容器中程序的交互。比如我們可以向容器中的應用發送一個重新加載信號,容器中的應用程序在接到信號后執行相應的處理程序完成重新加載配置文件的任務。本文將介紹在 docker 容器中捕獲信號的基本知識。

信號(linux)

信號是一種進程間通信的形式。一個信號就是內核發送給進程的一個消息,告訴進程發生了某種事件。當一個信號被發送給一個進程后,進程會立即中斷當前的執行流并開始執行信號的處理程序。如果沒有為這個信號指定處理程序,就執行默認的處理程序。

進程需要為自己感興趣的信號注冊處理程序,比如為了能讓程序優雅的退出(接到退出的請求后能夠對資源進行清理)一般程序都會處理 SIGTERM 信號。與 SIGTERM 信號不同,SIGKILL 信號會粗暴的結束一個進程。因此我們的應用應該實現這樣的目錄:捕獲并處理 SIGTERM 信號,從而優雅的退出程序。如果我們失敗了,用戶就只能通過 SIGKILL 信號這一終極手段了。除了 SIGTERM 和 SIGKILL ,還有像 SIGUSR1 這樣的專門支持用戶自定義行為的信號。下面的代碼簡單的說明在 nodejs 中如何為一個信號注冊處理程序:

process.on('SIGTERM', function() { console.log('shutting down...');});

關于信號的更多信息,筆者在《linux kill 命令》一文中有所提及,這里不再贅述。

容器中的信號

Docker 的 stop 和 kill 命令都是用來向容器發送信號的。注意,只有容器中的 1 號進程能夠收到信號,這一點非常關鍵!
stop 命令會首先發送 SIGTERM 信號,并等待應用優雅的結束。如果發現應用沒有結束(用戶可以指定等待的時間),就再發送一個 SIGKILL 信號強行結束程序。

kill 命令默認發送的是 SIGKILL 信號,當然你可以通過 -s 選項指定任何信號。

下面我們通過一個 nodejs 應用演示信號在容器中的工作過程。創建 app.js 文件,內容如下:

'use strict';var http = require('http');var server = http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World/n');}).listen(3000, '0.0.0.0');console.log('server started');var signals = { 'SIGINT': 2, 'SIGTERM': 15};function shutdown(signal, value) { server.close(function () {  console.log('server stopped by ' + signal);  process.exit(128 + value); });}Object.keys(signals).forEach(function (signal) { process.on(signal, function () {  shutdown(signal, signals[signal]); });});

這個應用是一個 http 服務器,監聽端口 3000,為 SIGINT 和 SIGTERM 信號注冊了處理程序。接下來我們將介紹以不同的方式在容器中運行程序時信號的處理情況。

應用程序作為容器中的 1 號進程

創建 Dockerfile 文件,把上面的應用打包到鏡像中:

FROM iojs:onbuildCOPY ./app.js ./app.jsCOPY ./package.json ./package.jsonEXPOSE 3000ENTRYPOINT ["node", "app"]

請注意 ENTRYPOINT 指令的寫法,這種寫法會讓 node 在容器中以 1 號進程的身份運行。

接下來創建鏡像:

$ docker build --no-cache -t signal-app -f Dockerfile .

然后啟動容器運行應用程序:

$ docker run -it --rm -p 3000:3000 --name="my-app" signal-app

此時 node 應用在容器中的進程號為 1:

docker,容器捕獲信號,捕獲信號

現在我們讓程序退出,執行命令:

$ docker container kill --signal="SIGTERM" my-app

此時應用會以我們期望的方式退出:

docker,容器捕獲信號,捕獲信號

應用程序不是容器中的 1 號進程

創建一個啟動應用程序的腳本文件 app1.sh,內容如下:

#!/usr/bin/env bashnode app 

然后創建 Dockerfile1 文件,內容如下:

FROM iojs:onbuildCOPY ./app.js ./app.jsCOPY ./app1.sh ./app1.shCOPY ./package.json ./package.jsonRUN chmod +x ./app1.shEXPOSE 3000ENTRYPOINT ["./app1.sh"]

接下來創建鏡像:

$ docker build --no-cache -t signal-app1 -f Dockerfile1 .

然后啟動容器運行應用程序:

$ docker run -it --rm -p 3000:3000 --name="my-app1" signal-app1

此時 node 應用在容器中的進程號不再是 1:

docker,容器捕獲信號,捕獲信號

現在給 my-app1 發送 SIGTERM 信號試試,已經無法退出程序了!在這個場景中,應用程序由 bash 腳本啟動,bash 作為容器中的 1 號進程收到了 SIGTERM  信號,但是它沒有做出任何的響應動作。

我們可以通過:

$ docker container stop my-app1# or$ docker container kill --signal="SIGKILL" my-app1

退出應用,它們最終都是向容器中的 1 號進程發送了 SIGKILL 信號。很顯然這不是我們期望的,我們希望程序能夠收到 SIGTERM  信號優雅的退出。

在腳本中捕獲信號

創建另外一個啟動應用程序的腳本文件 app2.sh,內容如下:

#!/usr/bin/env bashset -xpid=0# SIGUSR1-handlermy_handler() { echo "my_handler"}# SIGTERM-handlerterm_handler() { if [ $pid -ne 0 ]; then  kill -SIGTERM "$pid"  wait "$pid" fi exit 143; # 128 + 15 -- SIGTERM}# setup handlers# on callback, kill the last background process, which is `tail -f /dev/null` and execute the specified handlertrap 'kill ${!}; my_handler' SIGUSR1trap 'kill ${!}; term_handler' SIGTERM# run applicationnode app &pid="$!"# wait foreverwhile truedo tail -f /dev/null & wait ${!}done

這個腳本文件在啟動應用程序的同時可以捕獲發送給它的 SIGTERM 和 SIGUSR1 信號,并為它們添加了處理程序。其中 SIGTERM 信號的處理程序就是向我們的 node 應用程序發送 SIGTERM 信號。

然后創建 Dockerfile2 文件,內容如下:

FROM iojs:onbuildCOPY ./app.js ./app.jsCOPY ./app2.sh ./app2.shCOPY ./package.json ./package.jsonRUN chmod +x ./app2.shEXPOSE 3000ENTRYPOINT ["./app2.sh"]

接下來創建鏡像:

$ docker build --no-cache -t signal-app2 -f Dockerfile2 .

然后啟動容器運行應用程序:

$ docker run -it --rm -p 3000:3000 --name="my-app2" signal-app2

此時 node 應用在容器中的進程號也不是 1,但是它卻可以接收到 SIGTERM 信號并優雅的退出了:

docker,容器捕獲信號,捕獲信號

結論

容器中的 1 號進程是非常重要的,如果它不能正確的處理相關的信號,那么應用程序退出的方式幾乎總是被強制殺死而不是優雅的退出。究竟誰是 1 號進程則主要由 EntryPoint, CMD, RUN 等指令的寫法決定,所以這些指令的使用是很有講究的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩国产欧美区| 日本高清视频一区| 国产日韩在线精品av| 久久久精品免费视频| 97成人在线视频| 亚洲性日韩精品一区二区| 92裸体在线视频网站| 精品久久中文字幕| 久久国产精品久久久久久| 成人黄色在线播放| 国产精品成久久久久三级| 最近2019中文字幕在线高清| 日韩av有码在线| 国产精品久久久久99| 亚洲第一视频在线观看| 亚洲少妇中文在线| 亚洲人成网站免费播放| 国模私拍一区二区三区| 久久久久久久久国产精品| 岛国av一区二区在线在线观看| 97超级碰碰碰久久久| 欧美日韩黄色大片| 亚洲午夜av电影| 成人做爰www免费看视频网站| 国产脚交av在线一区二区| 欧美成人手机在线| 欧美裸体视频网站| 国产成人精品国内自产拍免费看| 日本国产一区二区三区| 国产欧美一区二区三区久久| 亚洲成人网在线观看| 少妇高潮 亚洲精品| 欧美性视频在线| 97**国产露脸精品国产| 亚洲欧美日韩区| 精品日本高清在线播放| 日韩在线视频免费观看高清中文| 少妇激情综合网| 欧美国产日韩一区二区在线观看| 成人免费在线网址| 中文字幕亚洲国产| 不卡av电影在线观看| 在线视频一区二区| 日韩欧美中文在线| 亚洲成成品网站| 亚洲综合精品伊人久久| 一区二区在线视频播放| 国产自产女人91一区在线观看| 成人免费观看a| 色婷婷**av毛片一区| 青青青国产精品一区二区| 九九精品在线视频| 国产日韩精品一区二区| 国产色综合天天综合网| 日韩精品中文字幕在线播放| 这里只有精品视频在线| 久久久久成人网| 久久久久成人精品| 国产在线播放91| 国产精品日韩欧美综合| 亚洲精品免费一区二区三区| 97人人模人人爽人人喊中文字| 国产精品成人品| 国产精品专区一| 91精品视频在线播放| 欧美午夜影院在线视频| 国产精品免费久久久| 亚洲黄色av女优在线观看| 精品国产精品三级精品av网址| www.精品av.com| 欧美超级免费视 在线| 亚洲精品wwwww| 日韩三级成人av网| 亚洲美女中文字幕| 国产精品女主播| 久久精品国产99国产精品澳门| 欧美成人精品一区| 伊人激情综合网| 亚洲国产成人精品女人久久久| 久久久精品免费| 中文字幕国产亚洲2019| 亚洲精品一区av在线播放| 中文字幕欧美视频在线| 久久久在线观看| 91丨九色丨国产在线| 国产亚洲精品一区二区| 怡红院精品视频| 欧美精品18videos性欧| 欧美大尺度电影在线观看| 亚洲国产成人精品女人久久久| 国产精品日日做人人爱| 成人伊人精品色xxxx视频| 黑人巨大精品欧美一区二区三区| 日韩国产欧美精品一区二区三区| 亚洲高清一二三区| 欧美性猛交99久久久久99按摩| 国产精品三级在线| 中文字幕亚洲专区| 久久99久久99精品免观看粉嫩| 日韩高清不卡av| 中文国产亚洲喷潮| 亚洲无av在线中文字幕| 国产一区二区三区视频在线观看| 亚洲视频999| 秋霞午夜一区二区| 精品一区二区三区四区在线| 亚洲精品狠狠操| 成人av番号网| 色噜噜狠狠狠综合曰曰曰88av| 国产精品电影一区| 久久久免费电影| 九九久久国产精品| 欧美激情一级欧美精品| 欧美日本黄视频| 日韩经典中文字幕在线观看| 久久亚洲一区二区三区四区五区高| 日韩在线观看免费网站| 国产精品1区2区在线观看| 国产成人精品久久亚洲高清不卡| 国产精品99蜜臀久久不卡二区| 国产精品丝袜一区二区三区| 亚洲成人久久网| 欧美性高跟鞋xxxxhd| 成人黄色大片在线免费观看| 亚洲激情在线观看视频免费| 精品毛片三在线观看| 午夜精品一区二区三区在线| 精品国偷自产在线视频99| 伊人男人综合视频网| 91精品综合久久久久久五月天| 精品日本美女福利在线观看| 亚洲大胆人体av| 国产精品一区二区三区久久久| 国产精品中文久久久久久久| 日韩网站免费观看高清| 亚洲丁香久久久| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品视频资源| 国产精品高潮在线| 亚洲精品久久久久中文字幕欢迎你| 国产精品视频公开费视频| 岛国视频午夜一区免费在线观看| 国产精品一区久久久| 国产精品久久久久久久久久99| 欧美精品videosex牲欧美| 国产精品视频公开费视频| 精品福利一区二区| 欧美精品日韩www.p站| 少妇高潮久久77777| 菠萝蜜影院一区二区免费| 亚洲高清一二三区| 国产69精品久久久久9999| 欧美激情日韩图片| 日韩中文字幕精品| 久久久国产一区二区| 久久精品福利视频| 日韩亚洲成人av在线| 欧美一级大片在线观看| 日韩一区在线视频| 国产精品电影网站| 国产精品免费福利| 久久久视频在线| 成人黄色免费在线观看| 国产在线观看一区二区三区|