成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Docker容器:如何讓應用程序優雅退出

云計算
伴隨著業務的不斷更新迭代,容器啟動的和停止經常發生,當容器停止時,如果容器內的程序未執行完,那么將會造成數據不完整,特別是一些分布式事務,可能會導致數據不一致,為此,容器引入優雅關閉功能。

 [[411410]]

伴隨著業務的不斷更新迭代,容器啟動的和停止經常發生,當容器停止時,如果容器內的程序未執行完,那么將會造成數據不完整,特別是一些分布式事務,可能會導致數據不一致,為此,容器引入優雅關閉功能。

在上一篇 能在容器里面kill -9殺死容器的文章中,已經介紹了如何捕獲信號,當我們執行docker stop命令后,docker會向容器中進程ID為1的進程發送SIGTERM(kill -15)信號,當等待一段時間后程序仍然沒有退出后,將發送SIGKILL(kill -9)信號強制殺死進程。等待時間可以通過參數設置

  1. # docker stop ----time=30 foo 

但如果使用docker kill命令的話,則不會有等待時間,直接發送SIGKILL信號。Kubernetes在容器關閉時候也是通過docker stop命令優雅關閉容器,當容器內應用接收到SIGTERM信號后將拒絕新的訪問請求并且執行完未處理的任務,回收占用的資源。下面通過一段Go的代碼舉例如何獲取SIGTERM信號并優雅退出。

  1. term := make(chan os.Signal) 
  2. signal.Notify(term, os.Interrupt, syscall.SIGTERM) 
  3. cancel := make(chan struct{}) 
  4. select { 
  5. case <-term: 
  6.    level.Warn(logger).Log(“msg“, “Received SIGTERM, exiting gracefully...“) 
  7.   #執行具體回收動作 

如果其他編程語言也相似,但這里有個坑需要需要注意,由于Docker關閉時候只給進程號是1的進程發送信號,也就是說如果應用程序的進程ID不是1,那么將不會收到信號Docker發出的信號。下面舉例說明,先看一個正常的JAVA程序:Kill.java 。

  1. class Kill { 
  2.     private static Thread main; 
  3.     public static void main(String[] a) throws Exception { 
  4.         Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
  5.             public void run() { 
  6.                 System.out.println("TERM"); 
  7.                 main.interrupt(); 
  8.                 for (int i = 0; i < 4; i++) { 
  9.                     System.out.println("busy"); 
  10.                     try { 
  11.                         Thread.sleep(1000); 
  12.                     } catch (Exception e) {} 
  13.                 } 
  14.                 System.out.println("exit"); 
  15.             } 
  16.         })); 
  17.         main = Thread.currentThread(); 
  18.         while (true) { 
  19.             Thread.sleep(1000); 
  20.             System.out.println("run"); 
  21.         } 
  22.     } 

執行”Javac Kill.java“編譯代碼并打包到Docker鏡像中,Dockerfile如下:

  1. FROM openjdk:8-jre-alpine 
  2. ADD Kill*.class / 
  3. ENTRYPOINT ["java","Kill"

啟動容器,進入容器可以看到”java Kill“進程號為1,當執行docker stop命令后程序將接收到TERM信號,并優雅退出。然后我們再修改一下Dockerfile,添加一個啟動腳本start.sh,腳本非常簡單就兩行,如下:

  1. #! /bin/sh 
  2. java Kill 

重新構建鏡像并啟動,新的Dockerfile如下:

  1. FROM openjdk:8-jre-alpine 
  2. ADD Kill*.class / 
  3. ADD start.sh / 
  4. ENTRYPOINT ["sh","-c","/start.sh"

啟動容器后,進入容器會發現,JAVA進程的ID變成7,成為shell(進程ID為1)的子進程。

  1. # ps -ef 
  2. ID   USER     TIME  COMMAND 
  3. 1     root      0:00 {start.sh} /bin/sh /start.sh 
  4.      root      0:00 java Kill 

此時再次執行docker stop命令,容器將不會收的TERM信號,并在默認的10秒優雅關閉時間后,直接退出(其實是被SIGKILL直接干掉了)。所以當需要優雅退出時必須保證應用程序的進程ID為1。

那有沒有別的方法,能夠在保證PID不為1的時候也能優雅退出呢?當然可以,有兩種常見的辦法:

(1)我們可以在容器關閉前執行prestop腳本,腳本里面首先動態獲取JAVA進程的ID,然后通過kill直接對這個進程發送TERM信號,從而優雅關閉程序。如下所示:

  1. PID=`pidof  java` && kill -SIGTERM $PID。 
  2. (2)可以通過tini容器啟動應用,tini的作為ID為1的進程,當他收到信號后就會轉發信號給子進程,那么子進程就可以執行優雅退出操作了。而且tini本身還具有回收僵尸進程的能力。 

(2)可以通過tini容器啟動應用,tini的作為ID為1的進程,當他收到信號后就會轉發信號給子進程,那么子進程就可以執行優雅退出操作了。而且tini本身還具有回收僵尸進程的能力。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2020-09-04 15:06:04

Docker容器化Node.js

2023-12-20 09:43:09

Docker容器代碼

2018-09-13 08:49:08

DockerPythonDjango

2020-11-06 08:13:03

服務器Nodejs客戶端

2015-10-14 10:29:59

2016-06-21 11:26:33

云計算

2009-05-28 09:25:32

AndroidGoogle移動OS

2017-02-24 08:56:47

API云計算IaaS

2016-02-15 09:37:14

Docker持續交付應用程序

2009-09-22 12:17:59

ibmdwLotus

2011-09-02 09:45:39

交互設計Android

2015-11-05 10:16:33

2022-09-19 00:37:13

SaaS云計算開發

2011-06-07 09:36:41

BlackBerry 應用程序

2019-07-05 08:00:00

WindowsWindows 10程序

2017-03-20 16:30:15

Android退出應用優雅方式

2013-11-19 15:35:01

2020-10-11 20:54:39

Python開發Docker

2015-09-06 09:17:31

2022-05-05 16:37:44

云原生網絡安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区在线免费观看 | 国产激情在线 | 欧美激情一区二区 | 久久男人天堂 | 九九九视频精品 | 另类在线 | 国产精品久久久久久久久久久久久 | 国产精品99久久久久久久久 | 在线伊人网 | 久久久精品久久久 | 毛片片| а_天堂中文最新版地址 | 亚洲欧美一区二区三区在线 | 国产专区在线 | 国产精品久久久久久久午夜片 | 午夜精品三区 | 午夜理伦三级理论三级在线观看 | 国产日韩精品视频 | 国产精品久久久久久久久久久久 | 午夜丰满少妇一级毛片 | 拍真实国产伦偷精品 | 成人在线观看免费爱爱 | 在线成人一区 | 国产成人精品一区二 | 国产精品夜色一区二区三区 | 欧美 日韩 国产 成人 在线 | 国产一区三区在线 | 日韩欧美中文字幕在线观看 | 久久久久综合 | 国产激情偷乱视频一区二区三区 | 欧洲精品在线观看 | 美女毛片免费看 | 欧美亚洲国产一区二区三区 | 欧美国产视频 | 亚洲在线免费观看 | 成人一级毛片 | 国产精品免费一区二区三区四区 | www.青青草 | 日韩一区二区三区在线 | 亚洲网视频 | 蜜臀网|