【发布时间】:2016-01-27 13:10:00
【问题描述】:
我正在尝试在 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,它会关闭应用程序。当我在 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
终于死了。
我没有在我的代码中捕获任何信号并忽略它们。我什至尝试增强上面的代码来捕获信号并将它们打印出来(这在我的主机上工作,但在容器中时,就好像信号从未到达程序一样)。
以前有人经历过吗?我还没有用另一种语言尝试过这样的事情,但我能够在服务器(例如mongo、nginx)在 docker 容器中时使用 Ctrl-C 杀死它们。为什么Go 不是在收到信号吗?
不确定这是否会有所不同,但我在 OSX 上并使用 docker-machine。
非常感谢任何帮助。
【问题讨论】:
-
我猜你已经读过medium.com/@gchudnov/…
标签: go docker boot2docker dockerfile