为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
Cats萌萌 2023-02-06 19:30:11
语境有一个应用程序在 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信号在大多数情况下是非终端的,容器收到信号后会继续运行。


因此,根据命令中提供的信号,容器可能会或可能不会在信号处理后被杀死。


查看完整回答
反对 回复 2023-02-06
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号