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

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

Go Webapp 的 Dockerfile 目錄結構

Go Webapp 的 Dockerfile 目錄結構

Go
紅糖糍粑 2023-03-21 15:08:24
我正在用 Go 開發一個測試 hello 應用程序,它可以訪問 Postgres 數據庫。這將使用 statefulset 在 kubernetes 中發布,并且有一個 pod 和兩個容器鏡像(一個用于 pgsql,一個用于 goapp)。├── hello-app|   ├── templates|       ├── file1.gohtml|       ├── file2.gohtml|       └── file3.gohtml|   ├── Dockerfile|   └── hello-app.go├── psql|   ├── Dockerfile|   ├── createUser.sh|   └── createDB.sql├── yaml|   └── statefulset.yaml我很難讓 Dockerfile 和 Go 應用程序結合起來。在我的第一段 Go 代碼中,我使用“template.Must”函數來引用“templates”目錄。顯然,當我將其作為容器運行時,目錄結構是不同的。我還沒有完全弄清楚如何在 Dockerfile 中執行此操作,并且正在尋找一些指導。/app/hello-app.gopackage mainimport (        "database/sql"        "fmt"        "os"        _ "github.com/lib/pq"        "html/template"        "net/http"        "strconv")var db *sql.DBvar tpl *template.Templatefunc init() {        host := os.Getenv("VARIABLE")        var err error        db, err = sql.Open("postgres", "postgres://user:password@"+host+"/dbname?sslmode=disable")        if err != nil {                panic(err)        }        if err = db.Ping(); err != nil {                panic(err)        }        fmt.Println("You connected to your database.")        tpl = template.Must(template.ParseGlob("templates/*.gohtml"))/應用程序/DockerfileFROM golang:1.8-alpineRUN apk add --update go gitRUN go get github.com/lib/pq/...ADD . /go/src/hello-appRUN go install hello-appAdd templates templates/ENV USER=username \    PASSWORD=password \    DB=dbname \    HOST=hostname \    PORT=5432FROM alpine:latestCOPY --from=0 /go/bin/hello-app/ .ENV PORT 4040CMD ["./hello-app"]當我在 kubernetes (GCP) 中運行它時,我在 hello-app 容器上得到以下日志條目??只牛篽tml/模板:模式不匹配任何文件:templates/*.gohtml goroutine 1 [running]:html/template.Must
查看完整描述

3 回答

?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

在 Dockerfile 的第二階段,您只是從前一階段復制 Go 二進制文件。您還必須將您的templates目錄也復制到第二階段,以便 Go 二進制文件可以引用您的 HTML 模板:


FROM golang:1.8-alpine

RUN apk add --update go git

RUN go get github.com/lib/pq/...

ADD . /go/src/hello-app

RUN go install hello-app

ENV USER=username \

    PASSWORD=password \

    DB=dbname \

    HOST=hostname \

    PORT=5432


FROM alpine:latest

COPY --from=0 /go/bin/hello-app/ .

COPY --from=0 /go/src/hello-app/templates ./templates

ENV PORT 4040

CMD ["./hello-app"]

我不確定這是否是常見做法,但是當我對構建過程中的哪個文件夾中的內容感到困惑時,我只是簡單地列出有問題的目錄,ls以便更好地了解構建過程中可能發生的情況:


RUN ls

顯然,您可以在完成 Dockerfile 后刪除這些行。


查看完整回答
反對 回復 2023-03-21
?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

該錯誤是因為template.ParseGlob在您的模板目錄中找不到任何匹配的文件。而不是COPY --from=0 /go/bin/hello-app/ .嘗試使用復制整個目錄COPY <YOUR LOCAL GOPATH/src/hello-app> <DOCKER DIR PATH>。此外,當您構建應用程序時,您的模板文件夾仍將位于源文件夾中,因此這也可能導致問題。go build解決方案是在應用程序目錄中運行并使用COPY我的命令。



查看完整回答
反對 回復 2023-03-21
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

我的模板文件夾遇到了同樣的錯誤,但通過在我的 Dockerfile 中使用此命令從我的根文件夾復制所有文件來解決它:


COPY . .

此外,當您使用外部庫時,您可能希望啟用 GO111MODULE。


在您的終端 (MacOS) 中:


export GO111MODULE=on

go mod init

在你的 Dockerfile 中:


COPY go.mod .

RUN go mod download


查看完整回答
反對 回復 2023-03-21
  • 3 回答
  • 0 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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