发送信号到Docker中的Golang应用程序

我正在尝试运行在docker容器内用golang编写的服务器。 例如:

package main import "net/http" func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello")) }) http.ListenAndServe(":3000", nil) } 

如果我在本地机器上运行这个代码,我可以用Ctrl-C发送一个SIGINT ,它将closures应用程序。 当我在Docker容器中运行它时,我似乎无法用Ctrl-C来杀死它。

 # Dockerfile FROM ubuntu:14.04 RUN apt-get update && apt-get -y upgrade RUN apt-get install -y golang ENV GOPATH /go COPY . /go/src/github.com/ehaydenr/simple_server RUN cd /go/src/github.com/ehaydenr/simple_server && go install CMD /go/bin/simple_server 

然后我开始使用docker发送信号给容器。

 docker kill --signal=INT 9354f574afd4 

仍在运行…

 docker kill --signal=TERM 9354f574afd4 

仍在运行…

 docker kill --signal=KILL 9354f574afd4 

终于死了。

我没有捕捉到我的代码中的任何信号,并忽略它们。 我甚至试图增加上面的代码来捕获信号并将其打印出来(它在我的主机上工作,但是当在容器中时,就好像信号从未到达程序那样)。

有谁之前经历过这个吗? 我还没有尝试过这样的另一种语言,但我能够杀死服务器(例如mongonginx )使用Ctrl-C,而他们在docker集装箱..为什么不是得到信号?

不知道这是否有所作为,但我在OSX上,并使用docker机。

任何帮助深表感谢。

你在一个shell中运行你的服务器,而shell是接收信号的进程。 您的服务器不会退出,直到您强制shell退出。

当使用CMD的“shell”forms时,它会将服务器作为参数启动到/bin/sh -c 。 为了直接执行服务器二进制文件,你需要提供一个CMD或ENTRYPOINT参数数组,从可执行文件的完整path开始。

 CMD ["/go/bin/simple_server"] 

来自Dockerfile文档中 ENTRYPOINT的注释 :

shellforms防止使用任何CMD或运行命令行参数,但有一个缺点,即您的ENTRYPOINT将作为/ bin / sh -c的子命令启动,该命令不传递信号。