国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

關于docker優雅退出的問題

weizx / 419人閱讀

摘要:容器信號使用我們跑在容器中的程序通常想在容器退出之前做一些清理操作,比較常用的方式是監聽一個信號,延遲關閉容器。我們測試一個構建運行再開一終端,運行發現并沒有打印出監聽信號失敗。

容器信號使用

我們跑在容器中的程序通常想在容器退出之前做一些清理操作,比較常用的方式是監聽一個信號,延遲關閉容器。

docker提供了這樣的功能:

╰─?  docker stop --help

Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]

Stop one or more running containers

Options:
      --help       Print usage
  -t, --time int   Seconds to wait for stop before killing it (default 10)

docker 1.13以上版本在創建容器時可直接指定STOP_TIMEOUT 和STOP_SIGNAL參數:

$ docker run --help
...
--stop-signal string                    Signal to stop a container, SIGTERM by default (default "SIGTERM")
--stop-timeout int                      Timeout (in seconds) to stop a container
...

但是。。。

我們測試一個:

package main

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

func main() {
    fmt.Println("signal test")
    go func() {
        for {
            c := make(chan os.Signal, 1)
            signal.Notify(c, syscall.SIGTERM)
            s := <-c
            fmt.Println("Got signal:", s)
        }
    }()
    time.Sleep(time.Second * 100)
}

Dockerfile:

FROM golang:1.8.0
COPY main.go .
RUN go build -o signal && cp signal $GOPATH/bin
CMD signal  

構建:

docker build -t signal:latest .

運行:

docker run --name signal signal:latest

再開一終端,運行:

docker stop -t 10 signal

發現并沒有打印出Got signal:... 監聽信號失敗。

問題再于:我們docker inspect signal看一下
可以看到

Path:/bin/sh
Args:[
  -c,
  signal
]

或者docker exec signal ps 看一下可以看到pid為1的進程并不是signal, 而是shell.

所以原因找到了,是因為docker engine只給pid為1的進程發送信號,sh收到了信號而我們想要的signal進程沒有收到信號

解決辦法:

FROM golang:1.8.0
COPY main.go .
RUN go build -o signal && cp signal $GOPATH/bin
CMD ["signal"]  # 不能寫成 CMD signal, 這會直接exec,否則會以shell的方式派生子進程。

更多問題希望大家關注我的github: https://github.com/fanux

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27050.html

相關文章

  • 優雅地關閉kubernetes中nginx

    摘要:被設計為這樣一種方式,父進程必須明確地等待子進程終止,以便收集它的退出狀態。會完成的刪除,將優雅退出的時間設置為表示立即刪除。 SIGINT SIGTERM SIGKILL區別 三者都是結束/終止進程運行。 1.SIGINT SIGTERM區別 前者與字符ctrl+c關聯,后者沒有任何控制字符關聯。前者只能結束前臺進程,后者則不是。 2.SIGTERM SIGKILL的區別 前者可以被...

    Noodles 評論0 收藏0
  • 優雅地關閉kubernetes中nginx

    摘要:被設計為這樣一種方式,父進程必須明確地等待子進程終止,以便收集它的退出狀態。會完成的刪除,將優雅退出的時間設置為表示立即刪除。 SIGINT SIGTERM SIGKILL區別 三者都是結束/終止進程運行。 1.SIGINT SIGTERM區別 前者與字符ctrl+c關聯,后者沒有任何控制字符關聯。前者只能結束前臺進程,后者則不是。 2.SIGTERM SIGKILL的區別 前者可以被...

    余學文 評論0 收藏0
  • docker 新手向 - 防止容器自動退出解決方案

    摘要:其實我們可以更優雅的使用容器的和參數來將系統必有命令作為前置命令開啟常駐運行,如此容器便不會自動退出了。 本文主要簡單介紹 docker 容器與前置進程的關系,以及如何編寫 Dockerfile/docker-compose.yml 優雅的讓容器可以常駐運行。 docker 容器的生命周期是同容器中的前置進程相關在一起的,這也是我們平時可能會遇到一些容器只是運行幾秒便自動退出的原因:因...

    Miyang 評論0 收藏0
  • Windows下運用Docker部署Node.js開發環境

    摘要:開始在下部署開發環境著實遍地坑,每遇到一個問題都要去原因再試圖解決。該鏡像就是已經安裝了環境的鏡像命名為。在下,期望運行應用的容器中,同樣可以執行該命令。 開始 在windows下部署nodejs開發環境著實遍地坑,每遇到一個問題都要去google原因再試圖解決。而且如果你想把你寫好的應用交給別人跑跑看,他可能同樣需要折騰很久才能真正在他的環境下運行起來。被坑了好些時日最終還是放棄,轉...

    canger 評論0 收藏0
  • Windows下運用Docker部署Node.js開發環境

    摘要:開始在下部署開發環境著實遍地坑,每遇到一個問題都要去原因再試圖解決。該鏡像就是已經安裝了環境的鏡像命名為。在下,期望運行應用的容器中,同樣可以執行該命令。 開始 在windows下部署nodejs開發環境著實遍地坑,每遇到一個問題都要去google原因再試圖解決。而且如果你想把你寫好的應用交給別人跑跑看,他可能同樣需要折騰很久才能真正在他的環境下運行起來。被坑了好些時日最終還是放棄,轉...

    ChristmasBoy 評論0 收藏0

發表評論

0條評論

weizx

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<