Rumah > pembangunan bahagian belakang > Golang > Pelayan dalam bekas Docker (menyediakan fail reactjs statik) halaman 404 tidak ditemui

Pelayan dalam bekas Docker (menyediakan fail reactjs statik) halaman 404 tidak ditemui

PHPz
Lepaskan: 2024-02-09 10:30:24
ke hadapan
606 orang telah melayarinya

Pelayan dalam bekas Docker (menyediakan fail reactjs statik) halaman 404 tidak ditemui

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!

Kandungan soalan

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")
}
Salin selepas log masuk

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" ]
Salin selepas log masuk

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
Salin selepas log masuk

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?

Penyelesaian

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
...
Salin selepas log masuk

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))
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan