gpt4 book ai didi

go - 向 Docker 中的 Golang 应用程序发送信号

转载 作者:IT王子 更新时间:2023-10-29 00:54:01 26 4
gpt4 key购买 nike

我正在尝试在 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

终于死了。

我没有在我的代码中捕捉到任何信号并忽略它们。我什至尝试扩充上面的代码以捕获信号并将它们打印出来(这在我的主机上有效,但在容器中时,就好像信号从未到达程序一样)。

有没有人遇到过这种情况?我没有用另一种语言尝试过类似的东西,但我可以使用 Ctrl-C 杀死服务器(例如 mongonginx)它们在 docker 容器中。为什么 Go 没有收到信号?

不确定这是否有影响,但我在 OSX 上并使用 docker-machine。

非常感谢任何帮助。

最佳答案

您在 shell 中运行您的服务器,而 shell 是接收信号的进程。在您强制 shell 退出之前,您的服务器不会退出。

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

CMD ["/go/bin/simple_server"]

来自 Dockerfile docs 中 ENTRYPOINT 的注释:

The shell form prevents any CMD or run command line arguments from being used, but has the disadvantage that your ENTRYPOINT will be started as a subcommand of /bin/sh -c, which does not pass signals.

关于go - 向 Docker 中的 Golang 应用程序发送信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33379567/

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