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

FastAPI+Uvicorn本地及Docker-compose正常,Docker Run无法接收请求求助

问题描述

搭建了一个按“端点分类”划分路由的FastAPI服务,本地终端执行uvicorn main:app --reload运行正常,用Docker-compose启动也能正常工作,但构建镜像后执行docker run myimage,服务虽然启动并显示地址http://0.0.0.0:8000,却无法接收请求。想知道为什么Docker-compose可用而Docker Run不行,同时需要能部署到Google Cloud Run的镜像。

相关配置文件

Dockerfile

FROM python:3.8.10
COPY ./app /app
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
RUN apt-get update
RUN apt-get --yes install libsndfile1-dev

EXPOSE 8000
CMD uvicorn app.main:app --host 0.0.0.0 --port 8000

Docker-compose文件

version: '3.3'
services:
  app:
    build: .
    command: uvicorn app.main:app --host 0.0.0.0 --port 8000
    ports:
      - "8000:8000"

main.py

from fastapi import FastAPI
import uvicorn
import os
from app.routes.api import router as api_router

app = FastAPI()
app.include_router(api_router)

@app.get('/')
def index():
   return {'message': 'Everything online'}
问题原因

Docker-compose配置里显式加了ports: - "8000:8000",这一步是把容器内部的8000端口映射到宿主机的8000端口,所以你能通过宿主机的localhost:8000访问服务。而直接用docker run myimage时,没加端口映射参数,容器内部的端口没有对外开放,宿主机无法和容器内的端口建立连接,自然接收不到请求。

解决办法
  1. 本地测试用docker run的正确命令
    执行以下命令,添加端口映射参数:
docker run -p 8000:8000 myimage

这样就能把容器的8000端口映射到宿主机的8000端口,之后访问localhost:8000就能正常请求服务。

  1. 针对Google Cloud Run的镜像适配
    Google Cloud Run不需要手动做端口映射,它会自动处理容器端口的暴露,但需确保两点:
  • 保留Dockerfile里的EXPOSE 8000,告诉Cloud Run容器监听的端口
  • 启动命令必须绑定0.0.0.0(你已配置完成),不能只绑定localhost,否则容器内的服务无法被Cloud Run的网络访问到

另外,Cloud Run默认会使用容器的CMD启动服务,你的Dockerfile里的CMD配置符合要求,无需额外修改。

内容的提问来源于stack exchange,提问作者M.vankekeren

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:30:55