2 回答

TA貢獻(xiàn)2012條經(jīng)驗 獲得超12個贊
Dockerfile 不會讓您的應(yīng)用程序監(jiān)聽特定的端口號。
Dockerfile 中的指令EXPOSE
純粹是一個文檔,不執(zhí)行任何功能。
Go 應(yīng)用程序有 2 個選項:
只需重構(gòu)您的代碼以讀取
PORT
env 變量:os.Getenv("PORT")
并在您開始的 HTTP 服務(wù)器地址上使用它:port := os.Getenv("PORT") http.ListenAndServe(":"+port)
-port
在 Dockerfile 中的應(yīng)用程序入口點(diǎn)期間創(chuàng)建一個標(biāo)志并讀取它:例如,如果您可以
go run main.go -port=8080
工作,請將您的 dockerfile 更改為:exec go run main.go -port=$PORT
這些會讓你得到你想要的。
理想情況下,您不應(yīng)go run
在容器內(nèi)使用。做就是了:
RUN go build -o /bin/my-app ./my/pkg ENTRYPOINT /bin/my-app
編譯一個 Go 程序并直接使用它。否則,每次Cloud Run啟動您的容器時,您都會從頭開始重新編譯它,這并不快,這會增加您的冷啟動時間。
除了這些,您的 dockerfile 中似乎還有很多不一致之處。你設(shè)置了很多像 GOOS GOARCH 這樣的 Go 環(huán)境變量,但你實際上并沒有設(shè)置go build
你的應(yīng)用程序(go run
我相信這是一個即時編譯并且沒有考慮 GOFLAGS 中的鏈接器標(biāo)志)。查看示例 Go dockerfiles 以更好地了解如何編寫慣用的 Go dockerfiles。
- 2 回答
- 0 關(guān)注
- 149 瀏覽
添加回答
舉報