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

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

如何在 Docker 中部署包含靜態文件的 Web 應用?

如何在 Docker 中部署包含靜態文件的 Web 應用?

Go
海綿寶寶撒 2022-08-15 10:09:35
我構建了一個帶有回聲的Web應用程序。一些來源是server.gopackage mainimport ...type TemplateRenderer struct {    templates *template.Template}func (t *TemplateRenderer) Render(w io.Writer, name string, data interface{}, c echo.Context) error {    if viewContext, isMap := data.(map[string]interface{}); isMap {        viewContext["reverse"] = c.Echo().Reverse    }    return t.templates.ExecuteTemplate(w, name, data)}func main() {    e := echo.New()    e.Static("/static", "static")    renderer := &TemplateRenderer{        templates: template.Must(template.ParseGlob("public/views/*.html")),    }    e.Renderer = renderer    e.GET("/", func(c echo.Context) error {        return c.Render(http.StatusOK, "index.html", map[string]interface{}{})    })    e.Logger.Fatal(e.Start(":8080"))}項目樹├── helper│   └── string.go└─── site    ├── Dockerfile    ├── go.mod    ├── go.sum    ├── server.go    ├── public    │   └── views    │       └── index.html    └── static我可以運行啟動服務器,一切正常。但是如果用docker運行它,就會出錯。go run server.goDockerfileFROM golang:1.15.2-alpine3.12 AS builderWORKDIR /appCOPY . .WORKDIR /app/siteRUN CGO_ENABLED=0 GOOS=linux go build -o serverFROM alpine:3.12COPY --from=builder /app/site /bin/.ENTRYPOINT [ "server" ]通過以下方式構建了一個 docker 映像docker build -t gcr.io/${PROJECT_ID}/myapp -f site/Dockerfile .在泊塢窗中運行應用docker run --rm -p 8080:8080 gcr.io/${PROJECT_ID}/myapppanic: html/template: pattern matches no files: `public/views/*.html`goroutine 1 [running]:html/template.Must(...)    /usr/local/go/src/html/template/template.go:372main.main()    /app/site/server.go:76 +0x2af該文件夾似乎未復制到映像中。但是在構建映像時沒有任何錯誤。怎么了?public
查看完整描述

2 回答

?
心有法竹

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

首先,您使用的是多階段 Docker 構建,它非常適合僅將編譯的二進制文件復制到最終映像。但是,在 Dockerfile 中,您將復制整個構建目錄 - 二進制文件以及所有源代碼。server


其次,您的主要問題是當圖像作為容器運行時,默認工作目錄是 - 因此服務器中的任何路徑都找不到中的html文件。//bin/public


如果你需要調試一個 docker 鏡像 - 特別是如果它是一個基于 linux 發行版(如 alpine)的鏡像 - 只需:


docker run -it myimage /bin/sh

無論如何,對您的docker的2個簡單修復:


FROM golang:1.15.2-alpine3.12 AS builder

WORKDIR /app

COPY . .

WORKDIR /app/site

RUN CGO_ENABLED=0 GOOS=linux go build -o server


FROM alpine:3.12

COPY --from=builder /app/site/server /bin

COPY --from=builder /app/site/public /public

ENTRYPOINT [ "/bin/server" ]


查看完整回答
反對 回復 2022-08-15
?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

在Go 1.16中,您可以將這些文件編譯成二進制文件本身。因此,您需要升級主機系統上的 Go 工具鏈,以及 Dockerfile 中構建階段的行。Go 1.16 添加了嵌入包和一個新指令來支持這一點。FROM//go:embed


首先,您需要告訴編譯器嵌入模板文件,構建一個文件系統對象:


import "embed"


// templateFiles contains the raw text of the template files.

//go:embed public/views/*.html

var templateFiles embed.FS

然后,當你去使用它時,Go 1.16還會添加一個相應的(“html/template”)。解析FS函數:


renderer := &TemplateRenderer{

    templates: template.Must(template.ParseFS(templateFiles)),

}

現在所有文件都嵌入在二進制文件本身中,您不應該收到“找不到文件”類型錯誤。您可以考慮僅將已編譯的二進制文件復制到最終映像中,而不將任何其他內容復制到最終映像中。


# Upgrade to Go 1.16

FROM golang:1.16-alpine3.12 AS builder

# Unchanged from original

WORKDIR /app

COPY . .

WORKDIR /app/site

RUN CGO_ENABLED=0 GOOS=linux go build -o server


FROM alpine:3.12

# Only copy the compiled binary and not the source tree

COPY --from=builder /app/site/server /bin

# Generally prefer CMD to ENTRYPOINT

CMD [ "server" ]


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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