无法正常closuresdocker进程
我希望能够优雅地closuresdocker进程。 我通过以下博客文章中的想法推导出这些文件: 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)app / 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) }
我通过运行构build图像
docker build -f Dockerfile -t docker-shutdown .
我开始一个容器
docker run docker-shutdown
然后我尝试closures它
docker stop <container id>
在运行“docker run”的控制台中,我可以看到:
waiting for finish
它只是终止,没有进一步的输出。
我期望至less看到一些输出
caught sig <SIGNAL_VALUE>
那么为什么我的预期行为没有发生? 我也是新来的,所以我不确定它是否可能与Dockerfile
中的代码或CMD
定义有关。
我的问题:
为什么go
程序不能捕捉TERM和KILL信号?
go run
正在获取信号,而不是正在运行的程序。
提前编译程序,并直接在docker中运行二进制文件,它将按预期工作。