登录
首页 >  Golang >  Go问答

Docker 在运行 go 服务器时没有响应

来源:stackoverflow

时间:2024-03-08 16:09:25 407浏览 收藏

本篇文章向大家介绍《Docker 在运行 go 服务器时没有响应》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

我无法通过发送中断信号来停止 docker 容器中的 docker golang web 服务器。 我有以下 main.go:

package main

import (
    "log"
    "net/http"
)

func main() {
    http.handlefunc("/", func(w http.responsewriter, r *http.request) {      
        w.write([]byte("hello"))
    })
    log.fatal(http.listenandserve(":1818", nil))
}

和 dockerfile:

from golang:1.11.4-alpine3.8
workdir /go/src/server
copy main.go main.go
cmd ["go", "run", "main.go"]

我构建:

docker build -t goserver .

并运行图像:

docker run -p 1818:1818 goserver

此时服务器正在运行。当我在控制台容器(和服务器进程)中按下 ctrl+c 时,容器(和服务器进程)仍在运行,停止的唯一方法是调用 docker 来执行此操作。 我想知道如何处理此类行为,以便服务器和容器在按 ctrl+c 时停止。

docker 版本 18.09.1


解决方案


您正在使用 go run,因此您将信号发送到 go 工具,而不是您的服务器进程。您可以在shell中通过run来中断启动的服务器,因为shell中的ctrl+c将信号发送到整个进程组。

也没有理由在每次启动容器时都编译可执行文件(随着程序的扩展,这可能会产生更多的开销)。创建映像时构建可执行文件的效率更高,并且可以让您直接执行服务器。

docker 文件示例:

from golang:1.11.4-alpine3.8
workdir /go/src/server
copy main.go main.go
run go build
cmd ["./server"]

在这里看到类似的问题,其中进程是 shell 而不是 go 工具:

Sending signals to Golang application in Docker

为了让 docker run 将 sigint 等信号转发到容器,您需要将 --interactive--tty 标志传递给 docker run,通常缩写为-it

如果没有这些标志,信号就不会像您提到的那样转发:

$ docker run -p 1818:1818 goserver
^c

但是,设置了标志后,信号将转发到容器,并且程序将退出,就像直接在 shell 中运行一样:

$ docker run -it -p 1818:1818 goserver
^Csignal: interrupt
$

理论要掌握,实操不能落!以上关于《Docker 在运行 go 服务器时没有响应》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>