猿问

在 `docker kill --signal=SIGX` 上以这种方式关闭在容器内运行的 go

语境

有一个应用程序在 docker 容器中运行。什么时候docker stop %container_id%发送容器接收SIGTERM。此信号在 golang 应用程序内部通过在退出前执行清理代码来处理。在这种情况下,代码是退出前的单个日志语句。

问题

  1. 是否保证容器在这条语句执行前不会消失?

  2. 如果是,它是否适用于其他信号?

  3. 如果没有,是否有适用的信号?

func main() {

    http.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) {

        fmt.Fprintln(rw, "chirtkem mudila")

    })


    go func() {

        if err := http.ListenAndServe(":8080", nil); err != nil {

            log.Fatal(err)

        }

    }()


    interupt := make(chan os.Signal, 1)

    signal.Notify(interupt, syscall.SIGTERM, syscall.SIGINT)

    <-interupt


    log.Println("graceful shutdown") // is it guaranteed to execute before container ceases to exist?

}


Cats萌萌
浏览 154回答 1
1回答

神不在的星期二

在docker stop %container_id%docker 发送SIGTERM并等待的timeout情况下,默认 10 秒,并发送 SIGKILL。此超时可使用--time选项配置,文档Usage:&nbsp; docker stop [OPTIONS] CONTAINER [CONTAINER...]Stop one or more running containersOptions:&nbsp; -t, --time int&nbsp; &nbsp;Seconds to wait for stop before killing it (default 10)因此 (1) 如果语句花费的时间超过这个时间,则不能保证容器在语句完成期间仍然存活。对于 (2) 和 (3) 因为 (1) 是否并且docker stop没有信号覆盖,不适用于其他信号。docker kill有信号覆盖,默认为 SIGKILL,带--signal标志。 文档虽然默认 (SIGKILL) 信号将终止容器,但通过 --signal 设置的信号可能是非终端信号,具体取决于容器的主进程。例如SIGHUP信号在大多数情况下是非终端的,容器收到信号后会继续运行。因此,根据命令中提供的信号,容器可能会或可能不会在信号处理后被杀死。
随时随地看视频慕课网APP

相关分类

Go
我要回答