editor php Baicao akan memperkenalkan kepada anda cara menyelesaikan masalah halaman 404 tidak ditemui apabila menyediakan fail ReactJS statik dalam bekas Docker. Semasa menggunakan aplikasi menggunakan Docker, anda kadangkala menghadapi masalah ini, tetapi jangan risau, kami boleh menyelesaikannya dengan beberapa langkah mudah. Dalam artikel ini, saya akan berkongsi cara mengkonfigurasi bekas Docker dengan betul untuk menyampaikan fail ReactJS statik dan cara mengelakkan ralat halaman 404 tidak ditemui. Mari lihat!
Saya cuba menyimpan aplikasi Go yang menyediakan fail statik pada port 8000. Saya telah melihat siaran lain mengenai topik ini dan nampaknya ramai yang mengatakan untuk menggunakan router.Run("0.0.0.0:8000")
或 router .运行(“:8000”)
. Saya telah mencuba kedua-duanya tetapi masih tidak berjaya. Main.go saya kelihatan seperti ini:
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") }
Dan fail Docker berikut:
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" ]
Struktur folder saya kelihatan seperti di bawah;
portal - frontend (here the react app is stored) - backend (all my backend logic) - Dockerfile - main.go - go.mod
Apabila saya menjalankannya menggunakan go run main.go
在本地运行它时,前端在端口 8000 上正确运行,并且加载 http://localhost:8000 工作正常。当我使用 docker build -t Portal .
构建 docker 映像,然后使用 docker run -p 8000:8000 --name Portal Portal
Saya dapat melihat dalam terminal bahawa pelayan bermula dan mengatakan ia berjalan pada port 8000, tetapi saya sentiasa mendapat ralat 404 Halaman Tidak Ditemui.
Saya cuba menggunakan router.Run("0.0.0.0:8000")
、router.run("localhost:8000")
或 docker run --network host --name Portal Portal
.
Adakah saya terlepas apa-apa? Adakah saya menyalin binaan bahagian hadapan ke lokasi yang salah?
Satu-satunya perkara dalam imej akhir ialah anda bergerak ke peringkat akhir dalam FROM
行之后 COPY
的内容;即 main
二进制文件和 .env
文件。您正在尝试从 ./frontend/...
提供文件,但这不在最终图像中。只需将相关的 COPY
baris terakhir dan itu sahaja.
FROM alpine:3.13 COPY --from=build-go /main /main COPY --from=build-node /workdir/.env .env COPY --from=build-node /workdir/build ./frontend/build # <-- move from above ...
Sebaliknya, kerana anda tidak menggunakan pakej embed
untuk membenamkan kod bahagian hadapan terbina terus ke dalam binari, anda tidak memerlukannya semasa fasa binaan (Go).
Menggunakan embed
juga boleh berfungsi tanpa menyusun semula fail Docker. Ini kelihatan lebih kurang sama dengan
//go:embed frontend/build/* var content embed.FS router.StaticFS("/static", http.FS(fs.Sub(content, "frontend/build/static")) router.StaticFileFS("/", "frontend/build/index.html", http.FS(content))
Dengan persediaan ini, bahagian hadapan perlu menjadi sebahagian daripada langkah binaan Go, tetapi kini ia disertakan sepenuhnya dalam binari dan tidak perlu disalin secara berasingan ke dalam imej akhir.
Atas ialah kandungan terperinci Pelayan dalam bekas Docker (menyediakan fail reactjs statik) halaman 404 tidak ditemui. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!