导致docker容器停止
我有一个docker容器,它按照以下方式运行go程序导致docker容器停止,docker,go,Docker,Go,我有一个docker容器,它按照以下方式运行go程序 package main import ( "fmt" "time" ) func main() { for { time.Sleep(2 * time.Second) fmt.Printf("woke up!\n") } } docker文档说明,当我们执行docker stopdocker时,docker会让容器在10秒内优雅地关闭,然后尝试通过发送不同的信号强制关闭容器。由
package main
import (
"fmt"
"time"
)
func main() {
for {
time.Sleep(2 * time.Second)
fmt.Printf("woke up!\n")
}
}
docker文档说明,当我们执行docker stop
docker时,docker会让容器在10秒内优雅地关闭,然后尝试通过发送不同的信号强制关闭容器。由于我的代码有一个无限循环,我不清楚当我在自定义docker映像中运行这个程序时,我的容器是如何以及为什么立即关闭的
此外,一旦我知道它为什么会关闭,我如何调整我的go程序,使其不关闭,并让docker强制关闭
我的理解基于
它有这样的文本:容器内的主进程将接收SIGTERM,在一段宽限期后,接收SIGKILL。
确切地说,我有办法吗
- 调整我的代码,忽略SIGTERM,docker守护进程最终必须对容器执行SIGKILL
- 调整代码,使SIGKILL也不会导致容器关闭(我知道在linux中,进程不能捕获或忽略SIGKILL)。但是有没有可能忽略SIGKILL,这样我的代码就愚弄了docker守护进程,容器就不会关闭
- 这不是Docker的问题,而是Go如何处理SIGTERM等信号
基本上,使用signal.Notify将允许您对SIGTERM执行操作,并完全按照您的要求执行操作,包括忽略它 类似这样的东西怎么样?它用于信号处理。下面的示例将允许CTRL+C停止,但将“抵抗”被
SIGTERM
或SIGKILL
终止
package main
import (
"fmt"
"github.com/syossan27/tebata"
"os"
"syscall"
"time"
)
func resist() {
fmt.Println("Don't shut me down man!")
}
func main() {
// Allow to be stopped by hitting CTRL+C
c := tebata.New(syscall.SIGINT)
c.Reserve(os.Exit, 1)
// Catch SIGTERM and SIGKILL and do nothing
t := tebata.New(syscall.SIGTERM, syscall.SIGKILL)
t.Reserve(resist)
// Print a message every 2 seconds
for {
select {
case <- time.After(2 * time.Second):
fmt.Println("Nothing happened...")
}
}
}
主程序包
进口(
“fmt”
“github.com/syossan27/tebata”
“操作系统”
“系统调用”
“时间”
)
func resist(){
fmt.Println(“别让我闭嘴,伙计!”)
}
func main(){
//允许通过按CTRL+C停止
c:=tebata.New(syscall.SIGINT)
c、 保留(操作系统出口,1)
//抓住西格姆和西格基尔什么也不做
t:=tebata.New(syscall.SIGTERM,syscall.SIGKILL)
t、 保留(抵抗)
//每2秒打印一条消息
为了{
挑选{
case你的问题是什么?@BernardoDuarte,我更明确地编辑并添加了我的问题,因为信号是由内核而不是容器处理的,所以它与代码无关,除非你在go中添加与内核对话的信号处理代码。