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

我正在尝试在 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-alpine


RUN apk upgrade -U \

  && apk add \

  ca-certificates \

  git \

  libva-intel-driver \

  make \

  && rm -rf /var/cache/*


ENV GOOS linux

ENV GOARCH amd64

ENV CGO_ENABLED=0

ENV GOFLAGS "-ldflags=-w -ldflags=-s"

ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH

RUN echo $PATH

RUN 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 install

ENV GO111MODULE=on \

  GOFLAGS="$GOFLAGS -mod=vendor"


WORKDIR /go/src/bitbucket.org/team/app/


COPY . .


CMD [ "go", "run", "cmd/main.go" ]


开心每一天1111
浏览 104回答 2
2回答

繁花如伊

Dockerfile 不会让您的应用程序监听特定的端口号。Dockerfile 中的指令EXPOSE纯粹是一个文档,不执行任何功能。Go 应用程序有 2 个选项:只需重构您的代码以读取PORTenv 变量:os.Getenv("PORT")并在您开始的 HTTP 服务器地址上使用它:port := os.Getenv("PORT") http.ListenAndServe(":"+port)-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。

慕姐4208626

看来您EXPOSE的 Dockerfile 中缺少了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go