Файлы Docker не заставляют ваше приложение прослушивать определенный номер порта.
Директива EXPOSE
в Dockerfile является чисто документацией и не выполняет никаких функций.
У вас есть 2 варианта приложения Go:
Просто реорганизуйте свой код, чтобы прочитать 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 запускает ваш контейнер, вы будете перекомпилировать его с нуля, что не быстро, это увеличит ваш холодный запуск * в 1037 * раз.
Помимо этого, у вас, похоже, много несоответствий в вашем докер-файле. Вы установили множество переменных Go env, например GOOS GOARCH, но на самом деле вы не go build
свое приложение (go run
- это компиляция на лету, и я не считаю, что флаги компоновщика в GOFLAGS учитываются). Посмотрите на примеры файлов Docker Go, чтобы лучше понять, как писать идиоматические файлы Docker.