Как правильно настроить Dockerfile для запуска в Google Cloud Run? - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь запустить приложение Go с помощью Docker в Google Cloud Run, но я получаю эту ошибку:

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" ]

Ответы [ 2 ]

6 голосов
/ 10 мая 2019

Файлы Docker не заставляют ваше приложение прослушивать определенный номер порта.

Директива EXPOSE в Dockerfile является чисто документацией и не выполняет никаких функций.

У вас есть 2 варианта приложения Go:

  1. Просто реорганизуйте свой код, чтобы прочитать PORT переменную env: 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 запускает ваш контейнер, вы будете перекомпилировать его с нуля, что не быстро, это увеличит ваш холодный запуск * в 1037 * раз.


Помимо этого, у вас, похоже, много несоответствий в вашем докер-файле. Вы установили множество переменных Go env, например GOOS GOARCH, но на самом деле вы не go build свое приложение (go run - это компиляция на лету, и я не считаю, что флаги компоновщика в GOFLAGS учитываются). Посмотрите на примеры файлов Docker Go, чтобы лучше понять, как писать идиоматические файлы Docker.

0 голосов
/ 10 мая 2019

Кажется, вам не хватает EXPOSE в вашем Dockerfile. Смотри https://docs.docker.com/engine/reference/builder/#expose

...