通过云下载大文件时出现 500 内部服务器错误 运行

500 Internal Server Error when downloading huge file through Cloud Run

出于测试目的构建了一个包含超过 30GB 的单个文件的巨大图像后,将图像部署到云端后我无法下载相同的文件 运行。

需要说明的是,该映像确实在云端构建和运行 运行,但由于某种原因,特定的大文件不可用。

下面是重现此错误的示例 Dockerfile:

FROM python:3
WORKDIR /app
RUN touch test # downloading this file works fine
RUN dd if=/dev/urandom of=file bs=1M count=32768 # this one takes a while to build and to deploy, and won't be downloadable later on.
EXPOSE 8080
CMD python -m http.server 8080 --bind 0.0.0.0

正在尝试通过 wget 下载文件 returns 以下内容:

wget https://cloud-run-link-here.app/file
--2020-03-03 17:19:16--  https://cloud-run-link-here.app/file
Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'
Resolving cloud-run-link-here.app (bigdocker-7k3mrt42la-uc.a.run.app)... :::::0, 0.0.0.0
Connecting to cloud-run-link-here.app (cloud-run-link-here.app)|:::::0|:443... connected.
HTTP request sent, awaiting response... 500 Internal Server Error
2020-03-03 17:19:17 ERROR 500: Internal Server Error.

在本地做同样的事情就好了。

Cloud 运行 的日志中没有有用的信息,如下图所示。

maximum response size for Cloud Run is 32MB and the HTTP server in the Python standard library is not recommended for production use。很可能它没有尝试对极大的请求进行分块并失败。

您应该考虑使用 gunicorn 等生产 HTTP 服务器。