You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Google Cloud Run部署Python Flask WSGI API时容器启动失败

解决Google Cloud Run部署Flask+uWSGI+Nginx容器时的端口监听失败问题

问题概述

部署基于WSGI的Flask API到Google Cloud Run时,容器无法启动并监听PORT=8080环境变量指定的端口,导致构建步骤失败,核心错误提示:

用户提供的容器无法启动并监听PORT=8080环境变量指定的端口

核心原因分析

当前配置存在两个关键问题:

  1. Nginx未监听PORT环境变量端口:默认配置中Nginx监听80端口,但Cloud Run强制要求容器监听PORT变量指定的端口(默认8080),导致平台检测不到端口监听。
  2. 多进程管理的潜在权限/启动顺序问题:使用supervisord管理uWSGI和Nginx时,若Nginx先启动但uWSGI的socket文件未创建,会导致Nginx连接失败。

修复方案

方案一:简化架构(推荐)—— 移除Nginx,直接用uWSGI监听端口

Cloud Run本身提供负载均衡能力,无需额外Nginx层,简化配置可降低出错概率:

1. 修改uwsgi.ini

将socket改为直接监听PORT环境变量指定的TCP端口:

[uwsgi]
module = src.wsgi
callable = app

uid = nginx
gid = nginx

# 直接监听PORT环境变量对应的TCP端口
http-socket = 0.0.0.0:%(env)PORT
master = true
cheaper = 1
processes = %(%k + 1)
die-on-term = true

2. 修改supervisord.conf

移除Nginx相关配置,仅保留uWSGI:

[supervisord]
nodaemon=true

[program:uwsgi]
command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

3. 修改Dockerfile

移除Nginx安装步骤:

FROM python:latest

RUN mkdir /app
WORKDIR /app
COPY . .

# 仅安装supervisord,无需Nginx
RUN apt-get update && apt-get install -y --no-install-recommends supervisor && rm -rf /var/lib/apt/lists/*

RUN pip install uwsgi
RUN pip install -r requirements.txt

RUN useradd --no-create-home nginx
RUN rm -r /root/.cache

COPY config/uwsgi.ini /etc/uwsgi/
COPY config/supervisord.conf /etc/

CMD ["/usr/bin/supervisord"]

方案二:保留Nginx,修改配置监听PORT变量

若必须保留Nginx,需让Nginx动态监听PORT环境变量:

1. 修改config/flask-site-nginx.conf

添加listen指令并使用变量占位符:

server {
    listen ${PORT};
    location / {
        try_files $uri @yourapplication;
    }
    location @yourapplication {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
    }
}

2. 修改supervisord.conf中Nginx启动命令

使用envsubst替换配置中的环境变量后再启动Nginx:

[program:nginx]
command=/bin/sh -c "envsubst '\$PORT' < /etc/nginx/conf.d/flask-site-nginx.conf > /tmp/flask-site-nginx.conf && mv /tmp/flask-site-nginx.conf /etc/nginx/conf.d/flask-site-nginx.conf && /usr/sbin/nginx"
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

3. 调整supervisord启动顺序(可选)

添加priority确保uWSGI先启动,避免Nginx连接socket失败:

[program:uwsgi]
command=/usr/local/bin/uwsgi --ini /etc/uwsgi/uwsgi.ini --die-on-term
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
priority=10

[program:nginx]
command=/bin/sh -c "envsubst '\$PORT' < /etc/nginx/conf.d/flask-site-nginx.conf > /tmp/flask-site-nginx.conf && mv /tmp/flask-site-nginx.conf /etc/nginx/conf.d/flask-site-nginx.conf && /usr/sbin/nginx"
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
priority=20

验证方法

本地测试容器时,手动指定PORT变量启动:

docker run -p 8080:8080 -e PORT=8080 your-image-name

访问http://localhost:8080确认服务正常后,再重新部署到Cloud Run。

内容的提问来源于stack exchange,提问作者Europa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:55:46