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