摘要:容器信號使用我們跑在容器中的程序通常想在容器退出之前做一些清理操作,比較常用的方式是監(jiān)聽一個信號,延遲關(guān)閉容器。我們測試一個構(gòu)建運(yùn)行再開一終端,運(yùn)行發(fā)現(xiàn)并沒有打印出監(jiān)聽信號失敗。
容器信號使用
我們跑在容器中的程序通常想在容器退出之前做一些清理操作,比較常用的方式是監(jiān)聽一個信號,延遲關(guān)閉容器。
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以上版本在創(chuàng)建容器時可直接指定STOP_TIMEOUT 和STOP_SIGNAL參數(shù):
$ 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
構(gòu)建:
docker build -t signal:latest .
運(yùn)行:
docker run --name signal signal:latest
再開一終端,運(yùn)行:
docker stop -t 10 signal
發(fā)現(xiàn)并沒有打印出Got signal:... 監(jiān)聽信號失敗。
問題再于:我們docker inspect signal看一下
可以看到
Path:/bin/sh Args:[ -c, signal ]
或者docker exec signal ps 看一下可以看到pid為1的進(jìn)程并不是signal, 而是shell.
所以原因找到了,是因?yàn)閐ocker engine只給pid為1的進(jìn)程發(fā)送信號,sh收到了信號而我們想要的signal進(jìn)程沒有收到信號
解決辦法:
FROM golang:1.8.0 COPY main.go . RUN go build -o signal && cp signal $GOPATH/bin CMD ["signal"] # 不能寫成 CMD signal, 這會直接exec,否則會以shell的方式派生子進(jìn)程。
更多問題希望大家關(guān)注我的github: https://github.com/fanux
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/27050.html
摘要:被設(shè)計為這樣一種方式,父進(jìn)程必須明確地等待子進(jìn)程終止,以便收集它的退出狀態(tài)。會完成的刪除,將優(yōu)雅退出的時間設(shè)置為表示立即刪除。 SIGINT SIGTERM SIGKILL區(qū)別 三者都是結(jié)束/終止進(jìn)程運(yùn)行。 1.SIGINT SIGTERM區(qū)別 前者與字符ctrl+c關(guān)聯(lián),后者沒有任何控制字符關(guān)聯(lián)。前者只能結(jié)束前臺進(jìn)程,后者則不是。 2.SIGTERM SIGKILL的區(qū)別 前者可以被...
摘要:被設(shè)計為這樣一種方式,父進(jìn)程必須明確地等待子進(jìn)程終止,以便收集它的退出狀態(tài)。會完成的刪除,將優(yōu)雅退出的時間設(shè)置為表示立即刪除。 SIGINT SIGTERM SIGKILL區(qū)別 三者都是結(jié)束/終止進(jìn)程運(yùn)行。 1.SIGINT SIGTERM區(qū)別 前者與字符ctrl+c關(guān)聯(lián),后者沒有任何控制字符關(guān)聯(lián)。前者只能結(jié)束前臺進(jìn)程,后者則不是。 2.SIGTERM SIGKILL的區(qū)別 前者可以被...
摘要:其實(shí)我們可以更優(yōu)雅的使用容器的和參數(shù)來將系統(tǒng)必有命令作為前置命令開啟常駐運(yùn)行,如此容器便不會自動退出了。 本文主要簡單介紹 docker 容器與前置進(jìn)程的關(guān)系,以及如何編寫 Dockerfile/docker-compose.yml 優(yōu)雅的讓容器可以常駐運(yùn)行。 docker 容器的生命周期是同容器中的前置進(jìn)程相關(guān)在一起的,這也是我們平時可能會遇到一些容器只是運(yùn)行幾秒便自動退出的原因:因...
摘要:開始在下部署開發(fā)環(huán)境著實(shí)遍地坑,每遇到一個問題都要去原因再試圖解決。該鏡像就是已經(jīng)安裝了環(huán)境的鏡像命名為。在下,期望運(yùn)行應(yīng)用的容器中,同樣可以執(zhí)行該命令。 開始 在windows下部署nodejs開發(fā)環(huán)境著實(shí)遍地坑,每遇到一個問題都要去google原因再試圖解決。而且如果你想把你寫好的應(yīng)用交給別人跑跑看,他可能同樣需要折騰很久才能真正在他的環(huán)境下運(yùn)行起來。被坑了好些時日最終還是放棄,轉(zhuǎn)...
摘要:開始在下部署開發(fā)環(huán)境著實(shí)遍地坑,每遇到一個問題都要去原因再試圖解決。該鏡像就是已經(jīng)安裝了環(huán)境的鏡像命名為。在下,期望運(yùn)行應(yīng)用的容器中,同樣可以執(zhí)行該命令。 開始 在windows下部署nodejs開發(fā)環(huán)境著實(shí)遍地坑,每遇到一個問題都要去google原因再試圖解決。而且如果你想把你寫好的應(yīng)用交給別人跑跑看,他可能同樣需要折騰很久才能真正在他的環(huán)境下運(yùn)行起來。被坑了好些時日最終還是放棄,轉(zhuǎn)...
閱讀 1817·2023-04-26 02:14
閱讀 3743·2021-11-23 09:51
閱讀 1393·2021-10-13 09:39
閱讀 3982·2021-09-24 10:36
閱讀 3023·2021-09-22 15:55
閱讀 3529·2019-08-30 12:57
閱讀 2045·2019-08-29 15:30
閱讀 1991·2019-08-29 13:19