關(guān)于docker容器優(yōu)雅退出的問題詳解
前言
最近因?yàn)楣ぷ鞯脑颍劦搅岁P(guān)于如何正確的退出運(yùn)行中的docker容器,這是一個(gè)非常值得討論的話題了。本文將給出詳細(xì)的介紹,下面來一起看看吧。
容器信號(hào)使用
我們跑在容器中的程序通常想在容器退出之前做一些清理操作,比較常用的方式是監(jiān)聽一個(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
再開一終端,運(yùn)行:
docker stop -t 10 signal
發(fā)現(xiàn)并沒有打印出Got signal:... 監(jiān)聽信號(hào)失敗。
問題再于:我們docker inspect signal
看一下
可以看到
Path:/bin/sh Args:[ -c, signal ]
或者docker exec signal ps
看一下可以看到pid為1的進(jìn)程并不是signal, 而是shell.
所以原因找到了,是因?yàn)?code>docker engine只給pid為1的進(jìn)程發(fā)送信號(hào),sh收到了信號(hào)而我們想要的signal進(jìn)程沒有收到信號(hào)
解決辦法:
FROM golang:1.8.0 COPY main.go . RUN go build -o signal && cp signal $GOPATH/bin CMD ["signal"] # 不能寫成 CMD signal, 這會(huì)直接exec,否則會(huì)以shell的方式派生子進(jìn)程。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
CentOS7使用docker部署Apollo配置中心的實(shí)現(xiàn)
這篇文章主要介紹了CentOS7使用docker部署Apollo配置中心的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10docker-compose up -d和docker-compose up -
本文主要介紹了docker-compose up -d和docker-compose up --build的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07docker-compose安裝部署NebulaGraph圖數(shù)據(jù)庫的詳細(xì)過程
NebulaGraph Studio是一款可以通過Web訪問的開源圖數(shù)據(jù)庫可視化工具,搭配NebulaGraph內(nèi)核使用,提供構(gòu)圖、數(shù)據(jù)導(dǎo)入、編寫nGQL查詢等一站式服務(wù),這篇文章主要介紹了docker-compose安裝部署NebulaGraph圖數(shù)據(jù)庫的詳細(xì)過程,感興趣的朋友一起看看吧2023-12-12Docker?ZooKeeper3.4.10集群安裝配置過程
這篇文章主要介紹了ZooKeeper3.4.10集群安裝配置-Docker,集群部署配置步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07使用dockerfile構(gòu)建nginx鏡像的方法示例
這篇文章主要介紹了使用dockerfile構(gòu)建nginx鏡像的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09Docker運(yùn)行hello-world鏡像失敗或超時(shí)的問題
在安裝Docker并嘗試運(yùn)行hello-world時(shí),可能會(huì)遇到超時(shí)問題,這通常是由于默認(rèn)的鏡像源訪問速度慢造成的,解決這個(gè)問題的辦法是更換鏡像源,雖然許多人推薦使用阿里云的鏡像源,對(duì)Docker hello-world超時(shí)問題感興趣的朋友一起看看吧2024-09-09