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
相关产品推荐
相关产品推荐

