摘要:容器信號使用我們跑在容器中的程序通常想在容器退出之前做一些清理操作,比較常用的方式是監聽一個信號,延遲關閉容器。我們測試一個構建運行再開一終端,運行發現并沒有打印出監聽信號失敗。
容器信號使用
我們跑在容器中的程序通常想在容器退出之前做一些清理操作,比較常用的方式是監聽一個信號,延遲關閉容器。
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
摘要:被設計為這樣一種方式,父進程必須明確地等待子進程終止,以便收集它的退出狀態。會完成的刪除,將優雅退出的時間設置為表示立即刪除。 SIGINT SIGTERM SIGKILL區別 三者都是結束/終止進程運行。 1.SIGINT SIGTERM區別 前者與字符ctrl+c關聯,后者沒有任何控制字符關聯。前者只能結束前臺進程,后者則不是。 2.SIGTERM SIGKILL的區別 前者可以被...
摘要:被設計為這樣一種方式,父進程必須明確地等待子進程終止,以便收集它的退出狀態。會完成的刪除,將優雅退出的時間設置為表示立即刪除。 SIGINT SIGTERM SIGKILL區別 三者都是結束/終止進程運行。 1.SIGINT SIGTERM區別 前者與字符ctrl+c關聯,后者沒有任何控制字符關聯。前者只能結束前臺進程,后者則不是。 2.SIGTERM SIGKILL的區別 前者可以被...
摘要:其實我們可以更優雅的使用容器的和參數來將系統必有命令作為前置命令開啟常駐運行,如此容器便不會自動退出了。 本文主要簡單介紹 docker 容器與前置進程的關系,以及如何編寫 Dockerfile/docker-compose.yml 優雅的讓容器可以常駐運行。 docker 容器的生命周期是同容器中的前置進程相關在一起的,這也是我們平時可能會遇到一些容器只是運行幾秒便自動退出的原因:因...
摘要:開始在下部署開發環境著實遍地坑,每遇到一個問題都要去原因再試圖解決。該鏡像就是已經安裝了環境的鏡像命名為。在下,期望運行應用的容器中,同樣可以執行該命令。 開始 在windows下部署nodejs開發環境著實遍地坑,每遇到一個問題都要去google原因再試圖解決。而且如果你想把你寫好的應用交給別人跑跑看,他可能同樣需要折騰很久才能真正在他的環境下運行起來。被坑了好些時日最終還是放棄,轉...
摘要:開始在下部署開發環境著實遍地坑,每遇到一個問題都要去原因再試圖解決。該鏡像就是已經安裝了環境的鏡像命名為。在下,期望運行應用的容器中,同樣可以執行該命令。 開始 在windows下部署nodejs開發環境著實遍地坑,每遇到一個問題都要去google原因再試圖解決。而且如果你想把你寫好的應用交給別人跑跑看,他可能同樣需要折騰很久才能真正在他的環境下運行起來。被坑了好些時日最終還是放棄,轉...
閱讀 1794·2023-04-26 02:14
閱讀 3719·2021-11-23 09:51
閱讀 1381·2021-10-13 09:39
閱讀 3963·2021-09-24 10:36
閱讀 3009·2021-09-22 15:55
閱讀 3511·2019-08-30 12:57
閱讀 2036·2019-08-29 15:30
閱讀 1980·2019-08-29 13:19