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

Docker部署FastAPI服务失败:连接重置错误排查求助

Docker部署FastAPI服务连接重置问题

本地通过Python运行FastAPI服务完全正常,但Docker部署后调用API时出现连接重置错误。

使用的命令:

  • 构建镜像:docker build -t my_project .
  • 运行容器:docker run -it -p 8080:8080 my_project
  • 测试API的curl命令:
curl -X POST "http://127.0.0.1:8080/predict/" -H "Content-Type: application/json" -d '{"image_sha": "example_sha"}'

错误信息:curl: (56) Recv failure: Connection reset by peer

server.py代码

import base64
import io

from fastapi import FastAPI
from typing import Any
import uvicorn
from PIL import Image
import pydantic

class ImageModelInput(pydantic.BaseModel):
    image_sha: str
    
    def get_base64_encoded_image(self) -> str:
        return "dummy_base64_image"

    def decode_image(self) -> Image.Image:
        image_data = base64.b64decode(self.image_base64)
        return Image.open(io.BytesIO(image_data))
        
class ImageModelOutput(pydantic.BaseModel):
    attributes: list[str]

class ImageModel:
    def __init__(self, model: Any):
        self.model = model
        self.app = FastAPI()
        
        @self.app.post("/predict/", response_model=ImageModelOutput)
        async def predict(input: ImageModelInput):
            image = input.get_base64_encoded_image()
            prediction = self.model_predict(image)
            return ImageModelOutput(attributes=prediction)
        
        @self.app.get("/readyz")
        async def readyz():
            return {"status": "ready"}

    def model_predict(self, image: Image.Image) -> list[str]:
        # 替换为实际模型预测逻辑
        return ["dummy_attribute_1", "dummy_attribute_2"]

    def run(self, host: str = "127.0.0.1", port: int = 8080):
        uvicorn.run(self.app, host=host, port=port)

# 示例运行
if __name__ == "__main__":
    # 替换为实际模型加载逻辑
    dummy_model = "Your_Model_Here"
    image_model = ImageModel(model=dummy_model)
    image_model.run()

Dockerfile代码

FROM python:3.12.4-slim@sha256:2fba8e70a87bcc9f6edd20dda0a1d4adb32046d2acbca7361bc61da5a106a914

WORKDIR /app

RUN --mount=type=cache,target=/root/.cache/pip \
    pip install -U pip poetry wheel

RUN addgroup --system somebody && \
    adduser --system --home /app --ingroup somebody somebody && \
    chown -R somebody:somebody /app

USER somebody

COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY my_project /app/my_project

ENV PYTHONUNBUFFERED=1

EXPOSE 8080
CMD python3 cx_ai_lightbox/server.py

问题原因及修复方案

1. 服务绑定地址错误

server.py中run方法默认绑定127.0.0.1,这个地址仅容器内部可访问,外部无法通过端口映射连接。需要修改为监听所有网卡:

def run(self, host: str = "0.0.0.0", port: int = 8080):
    uvicorn.run(self.app, host=host, port=port)

2. Dockerfile中文件路径不匹配

Dockerfile里COPY的是my_project目录到/app/my_project,但启动命令却指向cx_ai_lightbox/server.py,路径不一致会导致容器找不到启动文件。根据实际目录结构调整:

  • 如果server.py在本地my_project下,修改CMD为:
CMD python3 my_project/server.py
  • 如果本地目录是cx_ai_lightbox,则修改COPY命令为:
COPY cx_ai_lightbox /app/cx_ai_lightbox

3. 代码中的潜在逻辑错误

ImageModelInput类的decode_image方法引用了不存在的image_base64字段,会导致运行时错误,需修正:

def decode_image(self) -> Image.Image:
    image_data = base64.b64decode(self.get_base64_encoded_image())
    return Image.open(io.BytesIO(image_data))

4. 验证容器状态

修改后重新构建镜像并运行,先查看容器日志确认服务启动状态:

docker logs <容器ID或名称>

若日志显示服务已在0.0.0.0:8080启动,再测试API即可正常访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:14:54