我有一个使用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模块。
我尝试如下创建多阶段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")
并将其打印到控制台上。
答案 0 :(得分:3)
我认为您需要从Addr
属性中删除主机部分。
srv := &http.Server{
Handler: r,
Addr: ":8080",
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}