语境

有一个应用程序在 docker 集装箱内运行.当发送docker stop %container_id%时,容器接收SIGTERM.此信号在Golang应用程序中通过在退出前执行清理代码来处理.在本例中,代码是退出前的单个日志(log)语句.

问题

  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?
}

推荐答案

如果docker stop %container_id%个对接器发送SIGTERM并等待timeout,则默认为10秒,并发送SIGKILL.

此超时可使用--timedocs选项进行配置

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)是NO,docker stop对信号没有超驰,不适用于其他信号.

docker kill具有信号覆盖,默认为SIGKILL,具有--signal标志.docs

虽然默认(SIGKILL)信号将终止容器,但 信号设置通过--信号可以是非终端的,具体取决于 容器的主进程.例如,在大多数情况下,SIGHUP信号 将是非终端的,并且容器将在之后继续运行 正在接收信号.

因此,根据指挥中提供的信号,集装箱在信号处理后可能会被杀死,也可能不会被杀死.

Go相关问答推荐

SEARCH On Conflict Clause不考虑乐观锁定版本

Golang html/模板&需要错误数量的参数1在模板中使用';调用';获得0&q;

在Go中根据命名空间/字符串生成UUID

带有条件的for循环中缺少RETURN语句

是不是有什么原因导致`Strings.EqualFold`不先进行长度比较?

如何在出现错误时停止从通道读取?

从文件读取字节,将其保存到 struct 体并修改值

转到 bufio.Writer、gzip.Writer 并上传到内存中的 AWS S3

Golang text/template中的startswith函数 - 入门教程

最长连续重复的字符golang

当客户端同时是服务器时,需要什么 mTLS 证书?

设置 graphql 的最大文件上传大小(golang)

从数据库中带有 imageurl 的文件夹中获取图像,并在我的浏览器中用 golang 中的 echo 显示

如何模仿联合类型

Go cmp - 如何为以 struct 为键的映射定义自定义相等性?

对所有标志进行 ORing 的简短方法

使用反射在 struct 内迭代切片 struct

为什么我不能使用来自 gocloak 中 Login() 的访问令牌在 KeyCloak 中创建新客户端?

Go:如何创建一个可以提供配置文件中描述的 url 的服务器

不理解切片和指针