我有一个使用 Mux 用 GO 编写的简单 API。
在本地运行时它可以工作,但我正在尝试将此应用程序容器化。
我的 main.go
看起来像这样
package main
import (
"net/http"
"time"
"log"
"github.com/gorilla/mux"
"github.com/<username>/tweet-media-api/controllers"
)
func main() {
r := mux.NewRouter()
c := controllers.Controller{}
r.HandleFunc("/", c.BaseRoute()).Methods("GET")
r.HandleFunc("/healthz", c.HealthzRoute()).Methods("GET")
srv := &http.Server{
Handler: r,
Addr: "127.0.0.1:8080",
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}
log.Fatal(srv.ListenAndServe())
}
我的项目基本上是这样安排的
我正在使用 go version go1.11.4 darwin/amd64
我的项目正在使用 go modules。
我尝试创建一个多阶段 Dockerfile
,如下所示
# build stage
FROM golang:alpine AS build-env
ADD . /src
RUN apk update && apk upgrade && apk add --no-cache git
RUN cd /src && go build -o goapp
# final stage
FROM alpine
WORKDIR /app
COPY --from=build-env /src/goapp /app/
EXPOSE 8080
ENTRYPOINT ./goapp
我运行 docker build 。 -t my-app
在项目的根目录中,这完成了
Successfully built ebb41cfbef59
Successfully tagged my-app:latest
但是,当我运行 docker run -p 8080:8080 my-app
时,终端没有输出,并且在 http://localhost:8080/
上发出了 curl 请求> 没有回应。这对于浏览器请求也是一样的。
我是 Docker 的新手,对为什么这个构建不起作用感到困惑。
我知道我的容器正在运行我添加的应用程序
fmt.Println("Running")
这被打印到控制台。
最佳答案
我认为您需要从 Addr
属性中删除主机部分。
srv := &http.Server{
Handler: r,
Addr: ":8080",
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}
关于docker - 容器中的 Go API 不返回任何响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56312801/