【问题标题】:Cloud Run and Revel ContainerCloud Run 和 Revel 容器
【发布时间】:2021-02-13 05:36:39
【问题描述】:

我有一个简单的网站,使用 docker 镜像中的 revel 容器化构建。我正在尝试在 Cloud Run 中运行此映像。不幸的是,当我转到该站点的 URL 时,我在浏览器中看到了 502 和这条日志行

2020/10/30 17:27:07 http: proxy error: dial tcp 0.0.0.0:16166: connect: connection refused

我认为它与端口有关,但我尝试将端口最初映射到 9898,但我仍然在日志行中看到一个随机端口号。目前,按照 GCP 文档的建议,我将 revel 应用程序中的端口设置为 ${PORT}

我应该提到我可以毫无问题地在本地部署容器。

Dockerfile:

FROM golang:1.15 AS build
ENV CGO_ENABLED 0
ADD . /go/src/app

# Install revel framework
RUN go get -u github.com/revel/revel
RUN go get -u github.com/revel/cmd/revel
# Run revel app
EXPOSE ${PORT}
ENTRYPOINT revel run -a /go/src/app -p ${PORT} -m dev

Revel app.conf sn-p:

# The IP address on which to listen.
http.addr = 0.0.0.0

# The port on which to listen.
http.port = ${PORT}

更新: 建议使用硬编码的 8080 端口,看看是否可行。我仍然看到 502。我尝试再次在本地运行它,看起来 revel 试图在一个端口上设置,然后在另一个端口上作为反向代理进行侦听。因此,除非我认为这可能是一个狂欢问题,而不是 Cloud Run 问题

docker run --publish 8080:8080 app
Revel executing: run a Revel application
Changed detected, recompiling
Parsing packages, (may require download if not cached)... Completed
INFO  02:34:24    app     run.go:34: Running revel server
INFO  02:34:24    app   plugin.go:9: Go to /@tests to run the tests.
Revel engine is listening on.. 0.0.0.0:44795

Time to recompile 8.0340966s
Revel proxy is listening, point your browser to : 8080

请注意最后一行 Revel proxy is listening, point your browser to : 8080 以及 Revel engine is listening on.. 0.0.0.0:44795

【问题讨论】:

  • 没有什么能引起我的注意。但似乎您的容器正试图建立与 0.0.0.0:16166 的连接以进行代理,但它失败了。为什么狂欢会这样做?
  • 我不熟悉 Revel,但熟悉 Cloud Run。 Cloud Run 服务想要为您的容器提供${PORT},但该服务当前(总是?)将此值默认为8080。所以,你也需要 Revel 在8080 上运行。目前尚不清楚为什么在 Dockerfile 的 revel run ... -p ${PORT}app.conf 中都指定 ${PORT},因为大概前者会覆盖后者。您希望确保您的容器在给定环境变量${PORT} 时将在${PORT} 上运行(!),但您应该能够通过在Dockerfile 中将${PORT} 替换为8080 来解决此问题(!)
  • 确保revel run 也使用0.0.0.0 而不是localhost。我怀疑这已经是真的,因为您可以在本地运行和访问容器。
  • 一旦构建...如果您可以docker run ... --publish=8080:8080 ... 然后curl localhost:8080,您应该可以将其部署到 Cloud Run。
  • 我尝试在 8080 @DazWilkin 上运行,它在本地运行。但我确实看到现在仍然有一个奇怪的 localhost 端口。我也是新手,似乎它正在设置,然后在 8080 处收听反向代理,用这个编辑我的答案

标签: docker go google-cloud-platform google-cloud-run revel


【解决方案1】:

因此,经过进一步调查和讨论,当您通过revel run 运行狂欢应用程序时,似乎在随机端口上设置了一个代理,并且该连接是失败的原因。此外,通过revel run 运行的最大好处是已部署代码的热交换,这在已部署的上下文中是不必要的。所以这里的解决方案是通过revel build 构建应用程序并以这种方式运行该应用程序,以便仅使用应用程序端口进行连接。

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 2020-07-01
    • 2020-04-16
    • 2020-11-02
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    相关资源
    最近更新 更多