亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我的 Go Web 服務器在 Docker 容器內運行時會返回“找不到 404 頁面”?

為什么我的 Go Web 服務器在 Docker 容器內運行時會返回“找不到 404 頁面”?

Go
海綿寶寶撒 2022-08-15 10:04:35
我正在Go中構建一個小型的基本Web服務器。如果我在本地編譯并運行它,它工作得很好 - 沒有問題。頁面顯示,可以從本地主機訪問,樣式完好無損 - 一切都很好。如果我在Docker容器中執行此操作,則它不起作用。它返回“404 頁未找到”。就像它沒有任何靜態資產一樣...但這肯定不可能 - 靜態資產有意嵌入到二進制文件中,使用“//go:embed”...正如我所說,如果你在本地構建和運行,它工作正常。我已經嘗試了我能想到的一切...下面列出的一些步驟:各種不同的 docker 映像(alpine、ubuntu、golang、golang alpine 等)使用go:以不同的方式嵌入,即不同的模式我把一些基本的登錄到服務器代碼...但它似乎沒有返回任何錯誤,所以沒有幫助更改的端口/地址這只是我嘗試過的一些東西,沒有運氣。我已經排除了下面的css,它并不真正相關,因為索引頁面甚至沒有顯示任何樣式。代碼: 服務器代碼DOCKERFILE:FROM golang:1.16.0-alpine3.13 AS buildWORKDIR /appCOPY . .RUN go build -o server .FROM golang:1.16.0-alpine3.13WORKDIR /appCOPY --from=build /app/server .EXPOSE 8080CMD ["./server"]網頁:<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>GOOO</title>    <link rel="stylesheet" href="/assets/static/css/style.css"></head><body>    <h1>GO!!!</h1></body></html>目錄結構:├── Dockerfile├── go.mod├── go.sum├── server.go├── server_test.go├── static│   ├── css│   │   └── style.css│   └── index.html
查看完整描述

1 回答

?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

根據評論,您遇到的主要問題是您正在從文件系統(而不是嵌入式文件系統)提供服務,并且該文件不存在于其中。index.html


第二個問題是嵌入式文件系統將包含單個目錄,因此您需要使用類似的東西才能工作(否則您將需要 - 這適用于您的以及提供索引時.html)。statics, err := fs.Sub(static, "static")s.Open("index.html")static.Open("static/index.html")http.FileServer


注意:您可能不需要以下內容,因為您可以只為路徑運行(因此它提供服務以及子目錄中的文件)。 如果 url 中未提供文件名,則會自動提供服務。http.FileServer/index.htmlhttp.FileServerindex.html


要從嵌入式文件系統中提供服務,您可以將函數重寫為(未經測試!index.html


// default/root handler which serves the index page and associated styling

func indexHandler(w http.ResponseWriter, r *http.Request) {

    f, err := s.Open("index.html") // Using `s` from above and assumes its global; better to use handlerfunc and pass filesystem in


    if err != nil {

        // Send whatever error you want (as file is embedded open should never fail)

        return

    }

    defer f.Close()


    w.Header().Set("Content-Type", "text/html")

    if _, err := io.Copy(w, f); err != nil { // Write out the file

        // Handle error

    }

}

上面依賴于一個全局變量(我不熱衷于它),所以我會把它轉換成這樣的東西:


func IndexHandlerFunc(fs fs.FS, h http.Handler) http.Handler {

    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        f, err := fs.Open("index.html")


        if err != nil {

            // Send whatever error you want (as file is embedded open should never fail)

            return

        }

        defer f.Close()


        w.Header().Set("Content-Type", "text/html")

        if _, err := io.Copy(w, f); err != nil { // Write out the file

            // Handle error

        }

    })

}


查看完整回答
反對 回復 2022-08-15
  • 1 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號