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时,没加端口映射参数,容器内部的端口没有对外开放,宿主机无法和容器内的端口建立连接,自然接收不到请求。
解决办法
- 本地测试用docker run的正确命令
执行以下命令,添加端口映射参数:
docker run -p 8000:8000 myimage
这样就能把容器的8000端口映射到宿主机的8000端口,之后访问localhost:8000就能正常请求服务。
- 针对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
相关产品推荐
相关产品推荐

