如何在Google Cloud Platform(GCP)中部署含多Flask子应用的项目?
GCP部署多Flask应用(内部调用)方案
你的本地方案依赖subprocess启动子进程、webbrowser打开页面,这类逻辑在GCP服务器环境完全不适用,以下是三种可行的部署方案,按推荐优先级排序:
方案1:拆分App Engine独立服务(推荐)
将每个Flask应用作为App Engine的独立服务,通过内部域名实现跨服务调用。
步骤1:调整代码与配置
- 移除本地逻辑:删除
subprocess和webbrowser相关代码,改用HTTP请求调用其他服务。示例:import requests # 主应用调用app1服务的示例代码 def call_app1(): try: # 同项目内可直接用服务名+内部域名调用 response = requests.get("http://app1-dot-你的项目ID.appspot.com") return response.text except requests.exceptions.RequestException as e: return f"调用app1失败: {str(e)}" - 配置每个服务的
app.yaml:- 主服务(根目录
app.yaml):runtime: python39 service: main handlers: - url: /.* script: auto - app1服务(
app1/app.yaml):runtime: python39 service: app1 handlers: - url: /.* script: auto - app2服务同理,将
service字段设为app2。
- 主服务(根目录
- 统一依赖:根目录
requirements.txt需包含所有应用的依赖(如flask、requests)。
步骤2:部署服务
分别执行部署命令:
# 部署主服务 gcloud app deploy main.py app.yaml # 部署app1服务 gcloud app deploy app1/app.yaml # 部署app2服务 gcloud app deploy app2/app.yaml
注意事项
- 所有服务需在同一个GCP项目下,默认允许同项目服务间的内部HTTP调用。
- 每个服务的端口由App Engine自动管理,无需手动指定。
方案2:单个App Engine服务内整合多应用
如果不想拆分服务,可将三个Flask实例整合到一个WSGI应用中,通过路由分发请求。
步骤1:修改主应用代码
在main.py中导入子应用的Flask实例,通过路由转发请求:
import os from flask import Flask from app1.app1 import app as app1 from app2.app2 import app as app2 main_app = Flask(__name__) # 转发/app1/*路径到app1 @main_app.route('/app1/<path:path>') def serve_app1(path): return app1.full_dispatch_request() @main_app.route('/app1') def serve_app1_root(): return app1.full_dispatch_request() # 同理转发/app2/*路径到app2 @main_app.route('/app2/<path:path>') def serve_app2(path): return app2.full_dispatch_request() @main_app.route('/app2') def serve_app2_root(): return app2.full_dispatch_request() # 主应用自有路由 @main_app.route('/') def home(): # 内部调用子应用可直接调用其视图函数 return f"主应用首页 | app1首页内容: {app1.view_functions['index']()}" if __name__ == '__main__': port = int(os.environ.get('PORT', 8080)) main_app.run(host='0.0.0.0', port=port)
步骤2:调整子应用代码
确保子应用的Flask实例仅在直接运行时启动服务,避免冲突:
# app1/app1.py示例 from flask import Flask app = Flask(__name__) @app.route('/') def index(): return "app1首页" # 仅在本地直接运行时启动服务 if __name__ == '__main__': app.run(port=5000)
步骤3:部署单个服务
直接执行根目录部署命令:
gcloud app deploy
方案3:GKE容器化部署
若需更高灵活性(如自定义端口、资源配置),可将每个应用打包成Docker镜像,部署到Google Kubernetes Engine。
步骤1:编写Dockerfile
以app1为例,app1/Dockerfile内容:
FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY app1.py . COPY templates/ ./templates/ CMD ["python", "app1.py"]
步骤2:构建并推送镜像
# 构建app1镜像并推送到GCR gcloud builds submit --tag gcr.io/你的项目ID/app1 ./app1 # 同理构建并推送app2和main应用的镜像
步骤3:部署到GKE
为每个应用创建Deployment和ClusterIP类型的Service,主应用通过Service的内部域名(如http://app1-service.default.svc.cluster.local)调用子应用。
通用注意事项
- 端口适配:GCP环境会自动分配端口,所有Flask应用需读取环境变量
PORT监听端口:port = int(os.environ.get('PORT', 8080)) app.run(host='0.0.0.0', port=port) - 依赖检查:确保
requirements.txt包含所有依赖包,避免部署时缺失。
内容的提问来源于stack exchange,提问作者Omkar Kabde
相关产品推荐
相关产品推荐

