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

Martavis P .:

我正在尝试使用Docker在Google Cloud Run上运行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" ]
AhmetB-Google:

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

EXPOSEDockerfile中指令纯粹是一个文档,没有任何功能。

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中似乎还有很多不一致之处。您设置了很多Go Env变量,例如GOOS GOARCH,但实际上并没有设置go build您的应用程序(go run我相信它是即时编译的文件,并且没有考虑GOFLAGS中的链接器标志)。查看示例Go dockerfile,以更好地了解如何编写惯用的Go dockerfile。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Google Cloud Compute Engine上运行python脚本

如何请求由Go运行在Cloud Run上的gRPC服务器

在Google Cloud Platform上运行一个Docker容器

模块导入失败:如何使Google Cloud Client库在Google Cloud SDK上运行

在GKE上运行Google Cloud Datalab

在Google Cloud上的Docker映像中运行Jupyter Notebook

在Google Cloud Compute Engine上运行python脚本

如何在Google Cloud Functions上运行C ++文件?

如何安排在Google Cloud上运行的Docker

如何在本地运行我的Cloud Run服务?

如何在Google Cloud Run上运行WordPress?

始终在Google Cloud上运行Python脚本

输入运行Google Cloud Run的Docker容器

我无法使用Google Cloud Run配置Google Cloud Endpoints

在Google Cloud Run中运行Django的createsuperuser

如何从在Cloud Run上运行的Laravel项目连接到Cloud SQL?

配置在Anthos上运行的Cloud以转发HTTP2

如何在Cloud Run上为Google Cloud群集上的Anthos启用HTTPS?

ekg-core / GHC RTS:在Google Cloud Run上运行时虚假的GC统计信息

从Google Cloud上运行的Cloud访问Cloud SQL

Google Cloud Run,如何使用配置映射

在Cloud Run上本地运行数据流

无法在Google Cloud Run上安装jsonnet

如何在 Google Cloud App Engine 上运行 PHP 服务

从 Azure 上的 Linux 容器运行 Google Cloud Vision

如何在 Google Cloud 上运行 Laravel 调度程序

如何在 Google Cloud Functions 上运行 cython 的共享库?

如何使用 Cloud Build 对部署在 Cloud Run 上的节点应用运行测试

在 Google Cloud 上运行 C# 脚本