我正在try 包装一个在端口8000上提供静态文件的Go应用程序.我看过关于这个话题的其他帖子,很多人似乎都说用router.Run("0.0.0.0:8000")
或router.Run(":8000")
.我两个都试过了,但还是不成功.我的main.go如下所示:
package main
// required packages
import (
"fmt"
"log"
"os"
"github.com/gin-gonic/gin"
"github.com/gin-contrib/cors
"net/http"
)
func main() {
// start the server
serveApplication()
}
func serveApplication() {
corsConfig := cors.Config {
AllowOrigins: []string{"*"},
AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
AllowHeaders: []string{"Origin", "Content-Type", "Authorization"},
AllowCredentials: true,
}
router := gin.Default()
router.Use(cors.New(corsConfig))
router.StaticFS("/static", http.Dir("./frontend/build/static"))
router.StaticFile("/", "./frontend/build/index.html")
router.Run(":8000")
fmt.Println("Server running on port 8000")
}
和以下Dockerfile:
FROM node:16-alpine3.11 as build-node
WORKDIR /workdir
COPY frontend/ .
RUN yarn install
RUN yarn build
COPY .env /workdir/
FROM golang:1.21-rc-alpine3.18 as build-go
#FROM golang:1.17rc2-alpine3.14 as build-go
ENV GOPATH ""
RUN go env -w GOPROXY=direct
RUN apk add git
ADD go.mod go.sum ./
RUN go mod download
ADD . .
COPY --from=build-node /workdir/build ./frontend/build
RUN go build -o /main
FROM alpine:3.13
COPY --from=build-go /main /main
COPY --from=build-node /workdir/.env .env
EXPOSE 8000
ENTRYPOINT [ "/main" ]
我的文件夹 struct 如下所示;
portal
- frontend (here the react app is stored)
- backend (all my backend logic)
- Dockerfile
- main.go
- go.mod
当我在本地运行go run main.go
时,前端在端口8000上被正确地服务,并且加载http://localhost:8000工作得很好.当我用docker build -t portal .
构建docker映像,然后用docker run -p 8000:8000 --name portal portal
运行它时,我可以在终端中看到服务器启动,并说它在端口8000上运行,但我总是得到404页未找到错误.
我试过用router.run("0.0.0.0:8000")
、router.run("localhost:8000")
或docker run --network host --name portal portal
.
我有什么遗漏的吗?我是否将前端构建复制到了错误的位置?