gpt4 book ai didi

docker - 无法正常关闭 docker 进程

转载 作者:IT王子 更新时间:2023-10-29 01:41:23 28 4
gpt4 key购买 nike

我希望能够优雅地关闭 docker 进程。我按照这篇博文中的想法导出了这些文件:https://husobee.github.io/golang/ecs/2016/05/19/ecs-graceful-go-shutdown.html

这是我的文件

1) Dockerfile

FROM debian:jessie
ADD app /app
RUN apt-get update --fix-missing
RUN apt-get install -y golang
CMD ["go", "run", "/app/main.go"]

2) 应用程序/main.go

package main

import "os"
import "syscall"
import "fmt"
import "time"
import "os/signal"


func main() {
// create a "returnCode" channel which will be the return code of the application
var returnCode = make(chan int)

// finishUP channel signals the application to finish up
var finishUP = make(chan struct{})

// done channel signals the signal handler that the application has completed
var done = make(chan struct{})

// gracefulStop is a channel of os.Signals that we will watch for -SIGTERM
var gracefulStop = make(chan os.Signal)

// watch for SIGTERM and SIGINT from the operating system, and notify the app on
// the gracefulStop channel
signal.Notify(gracefulStop, syscall.SIGTERM)
signal.Notify(gracefulStop, syscall.SIGINT)

// launch a worker whose job it is to always watch for gracefulStop signals
go func() {
// wait for our os signal to stop the app
// on the graceful stop channel
// this goroutine will block until we get an OS signal
sig := <-gracefulStop
fmt.Printf("caught sig: %+v", sig)

// send message on "finish up" channel to tell the app to
// gracefully shutdown
finishUP<-struct{}{}

// wait for word back if we finished or not
select {
case <-time.After(30*time.Second):
// timeout after 30 seconds waiting for app to finish,
// our application should Exit(1)
returnCode<-1
case <-done:
// if we got a message on done, we finished, so end app
// our application should Exit(0)
returnCode<-0
}
}()


// ... Do business Logic in goroutines

fmt.Println("waiting for finish")
// wait for finishUP channel write to close the app down
<-finishUP
fmt.Println("stopping things, might take 2 seconds")

// ... Do business Logic for shutdown simulated by Sleep 2 seconds
time.Sleep(2*time.Second)

// write to the done channel to signal we are done.
done <-struct{}{}
os.Exit(<-returnCode)
}

我通过运行构建图像

docker build -f Dockerfile -t docker-shutdown . 

我通过

启动一个容器
docker run  docker-shutdown

然后我试着关闭它

docker stop <container id>

在运行“docker run”的控制台中,我可以看到:

waiting for finish

它只是终止而没有进一步的输出。

我希望至少能看到一些像

这样的输出
 caught sig <SIGNAL_VALUE>

那么为什么我预期的行为没有发生呢?我也是 go 的新手,所以我不确定它是否与 go 代码或 CMD 定义有关 Dockerfile.

我的问题:

为什么 go 进程无法捕获 TERMKILL 信号?

最佳答案

go run 正在获取信号,而不是正在运行的程序。

提前编译好程序,直接在docker中运行binary,就可以正常运行了。

关于docker - 无法正常关闭 docker 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45583641/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com