Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
导致docker容器停止_Docker_Go - Fatal编程技术网

导致docker容器停止

导致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秒内优雅地关闭,然后尝试通过发送不同的信号强制关闭容器。由

我有一个docker容器,它按照以下方式运行go程序

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中添加与内核对话的信号处理代码。