为了账号安全,请及时绑定邮箱和手机立即绑定

如何正确配置 Dockerfile 以在 Google Cloud Run 上运行?

如何正确配置 Dockerfile 以在 Google Cloud Run 上运行?

Go
开心每一天1111 2023-06-19 13:49:22
我正在尝试在 Google Cloud Run 上使用 Docker 运行 Go 应用程序,但出现此错误:Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable. Logs for this revision might contain more information.我将我的端口修复为8080文档中所述,但我认为我的 Dockerfile 不正确。有谁知道我错过了什么?FROM golang:1.12-alpineRUN apk upgrade -U \  && apk add \  ca-certificates \  git \  libva-intel-driver \  make \  && rm -rf /var/cache/*ENV GOOS linuxENV GOARCH amd64ENV CGO_ENABLED=0ENV GOFLAGS "-ldflags=-w -ldflags=-s"ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATHRUN echo $PATHRUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"RUN go get -u github.com/cespare/reflex# RUN reflex -h # Setup modules after reflex installENV GO111MODULE=on \  GOFLAGS="$GOFLAGS -mod=vendor"WORKDIR /go/src/bitbucket.org/team/app/COPY . .CMD [ "go", "run", "cmd/main.go" ]
查看完整描述

2 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

Dockerfile 不会让您的应用程序监听特定的端口号。

Dockerfile 中的指令EXPOSE纯粹是一个文档,不执行任何功能。

Go 应用程序有 2 个选项:

  1. 只需重构您的代码以读取PORTenv 变量:os.Getenv("PORT")并在您开始的 HTTP 服务器地址上使用它:

    port := os.Getenv("PORT")
    http.ListenAndServe(":"+port)
  2. -port在 Dockerfile 中的应用程序入口点期间创建一个标志并读取它:

    例如,如果您可以go run main.go -port=8080工作,请将您的 dockerfile 更改为:

    exec go run main.go -port=$PORT

这些会让你得到你想要的。

理想情况下,您不应go run在容器内使用。做就是了:

RUN go build -o /bin/my-app ./my/pkg
ENTRYPOINT /bin/my-app

编译一个 Go 程序并直接使用它。否则,每次Cloud Run启动您的容器时,您都会从头开始重新编译它,这并不快,这会增加您的冷启动时间。


除了这些,您的 dockerfile 中似乎还有很多不一致之处。你设置了很多像 GOOS GOARCH 这样的 Go 环境变量,但你实际上并没有设置go build你的应用程序(go run我相信这是一个即时编译并且没有考虑 GOFLAGS 中的链接器标志)。查看示例 Go dockerfiles 以更好地了解如何编写惯用的 Go dockerfiles。


查看完整回答
反对 回复 2023-06-19
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

看来您EXPOSE的 Dockerfile 中缺少了。

查看完整回答
反对 回复 2023-06-19
  • 2 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信