我正在尝试使用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" ]
Dockerfile不会使您的应用程序侦听特定的端口号。
EXPOSE
Dockerfile中的指令纯粹是一个文档,没有任何功能。
Go应用程式有2个选项:
只需重构代码即可读取PORT
env变量: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中似乎还有很多不一致之处。您设置了很多Go Env变量,例如GOOS GOARCH,但实际上并没有设置go build
您的应用程序(go run
我相信它是即时编译的文件,并且没有考虑GOFLAGS中的链接器标志)。查看示例Go dockerfile,以更好地了解如何编写惯用的Go dockerfile。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句