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

在Azure Durable Functions中用Docker部署Quart应用启动失败求助

Quart应用Docker部署Azure Function启动失败问题排查

问题场景

本地通过func start运行正常,但本地Docker运行时提示“Function host not running”,部署至Azure Function后访问显示“Application error”。以下是你的配置与代码,结合问题点逐一验证:


1. Dockerfile配置修正

原Dockerfile存在环境变量格式问题,已修正为正确写法:

FROM mcr.microsoft.com/azure-functions/python:4-python3.11
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \    
    AzureFunctionsJobHost__Logging__Console__IsEnabled=true
# Copy the function app files to the container
COPY . /home/site/wwwroot
# Upgrade pip and install dependencies
RUN pip install --upgrade pip && \
    pip install -r /home/site/wwwroot/requirements.txt
EXPOSE 8080
  • 修正了ENV行的格式,确保两个环境变量被正确设置
  • 将pip命令合并为一行,减少镜像构建层

2. WrapperFunction/init.py代码问题

语法错误修复

import azure.functions as func
import azure.durable_functions as duf

from common_util.utilities import logger
from FlaskApp import flask_app  # 修正:变量名不能用减号,改为flask_app
from quart import g


async def main(req: func.HttpRequest, mappingColumnsConfig: func.InputStream, starter: str, context: func.Context) -> func.HttpResponse:
    async with flask_app.app_context():
        
        g.client = duf.DurableOrchestrationClient(starter)
        g.mapping_columns_config = mappingColumnsConfig
        g.function_name = req.route_params["functionName"]
        
        # 修正:引用正确的实例名flask_app
        response = await func.AsgiMiddleware(app=flask_app.asgi_app).handle_async(req, context)
        
        status_code = response.status_code
        headers = dict(response.headers)
        body = response.get_body()
        
        return func.HttpResponse(body, status_code=status_code, headers=headers)
  • 核心错误:Python变量名不允许包含减号,原代码中flask-app属于非法命名,必须改为flask_app
  • 确保导入和引用的是正确的Quart实例名

3. FlaskApp/init.py代码问题

语法与逻辑修复

from quart import Quart
from quart_cors import cors
from common_util.utilities import logger  # 需导入logger,否则会报错


flask_app = Quart(__name__)
flask_app = cors(flask_app)


@flask_app.post("/api/pets/upload-petdata")  # 修正:使用实例名flask_app而非app
async def upload_petdata_route():
    try:
        # ----DB insert逻辑----
        pass
    except Exception as e:
        # 修正:缩进错误 + 拼写错误(inert→insert) + 输出错误详情
        logger.error(f"Pets data insert operation failed: {str(e)}")
  • 路由装饰器错误:必须使用定义的Quart实例flask_app,而非未定义的app
  • 缺失logger导入:未导入logger会导致运行时报错
  • 异常块缩进错误:except后的代码必须缩进,否则触发语法错误
  • 拼写错误:inert改为insert,同时捕获异常详情便于排查

4. 其他关键排查点

  • 依赖检查:确保requirements.txt包含所有必要包:
    quart>=0.18.0
    quart-cors>=0.5.0
    azure-functions>=1.17.0
    azure-durable-functions>=1.13.0
    
  • 本地Docker运行配置:启动容器时需设置AzureWebJobsStorage环境变量(即使使用存储模拟器):
    docker run -e AzureWebJobsStorage="UseDevelopmentStorage=true" -p 8080:8080 <your-image-name>
    
  • Azure Function部署配置:确认函数应用的配置中,FUNCTIONS_WORKER_RUNTIME设置为python,且Docker镜像拉取正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:22:04