Mar*_* P. 0 go docker google-cloud-platform google-cloud-run
我正在尝试使用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" ]
Run Code Online (Sandbox Code Playgroud)
Dockerfile不会使您的应用程序侦听特定的端口号。
EXPOSEDockerfile中的指令纯粹是一个文档,没有任何功能。
Go应用程式有2个选项:
只需重构代码即可读取PORTenv变量:os.Getenv("PORT")并在要启动的HTTP服务器地址上使用它:
port := os.Getenv("PORT")
http.ListenAndServe(":"+port)
Run Code Online (Sandbox Code Playgroud)创建一个-port标志并在Dockerfile中应用程序的入口点读取它:
例如,如果可以go run main.go -port=8080工作,请将您的dockerfile更改为:
exec go run main.go -port=$PORT
Run Code Online (Sandbox Code Playgroud)这些将为您提供所需的东西。
理想情况下,你不应该使用go run的容器内。做就是了:
RUN go build -o /bin/my-app ./my/pkg
ENTRYPOINT /bin/my-app
Run Code Online (Sandbox Code Playgroud)
编译Go程序并直接使用它。否则,每次Cloud Run启动容器时,您都会从头开始重新编译它,这不是很快,这会增加冷启动时间。
除此之外,您的dockerfile中似乎还有很多不一致之处。您设置了很多Go env var,例如GOOS GOARCH,但实际上并不是go build您的应用程序(go run我相信它是即时编译的文件,并且没有考虑GOFLAGS中的链接器标志)。查看示例Go dockerfile,以更好地了解如何编写惯用的Go dockerfile。
| 归档时间: |
|
| 查看次数: |
435 次 |
| 最近记录: |