语境有一个应用程序在 docker 容器中运行。什么时候docker stop %container_id%发送容器接收SIGTERM。此信号在 golang 应用程序内部通过在退出前执行清理代码来处理。在这种情况下,代码是退出前的单个日志语句。问题是否保证容器在这条语句执行前不会消失?如果是,它是否适用于其他信号?如果没有,是否有适用的信号?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?}
1 回答

神不在的星期二
TA贡献1963条经验 获得超6个赞
在docker stop %container_id%docker 发送SIGTERM并等待的timeout情况下,默认 10 秒,并发送 SIGKILL。
此超时可使用--time选项配置,文档
Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...]
Stop one or more running containers
Options:
-t, --time int Seconds to wait for stop before killing it (default 10)
因此 (1) 如果语句花费的时间超过这个时间,则不能保证容器在语句完成期间仍然存活。
对于 (2) 和 (3) 因为 (1) 是否并且docker stop没有信号覆盖,不适用于其他信号。
docker kill有信号覆盖,默认为 SIGKILL,带--signal标志。 文档
虽然默认 (SIGKILL) 信号将终止容器,但通过 --signal 设置的信号可能是非终端信号,具体取决于容器的主进程。例如SIGHUP信号在大多数情况下是非终端的,容器收到信号后会继续运行。
因此,根据命令中提供的信号,容器可能会或可能不会在信号处理后被杀死。
- 1 回答
- 0 关注
- 153 浏览
添加回答
举报
0/150
提交
取消