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

使用docker-compose启动FastAPI应用失败:api容器退出码2

解决FastAPI容器启动后exited with code 2的问题

首先,先获取容器的详细错误日志,这是定位问题的关键:

docker-compose logs api

根据你提供的配置,大概率是命令执行路径不匹配导致的,下面是具体问题和修复方案:

核心问题分析

  1. docker-compose.yaml中的command覆盖了Dockerfile的CMD,且路径错误
    Dockerfile里已经设置工作目录为/code,并指定启动命令为python3 /code/app/Main.py,但你在docker-compose.yaml里加了command: ["python3", "Main.py"],这会覆盖镜像的默认启动命令。此时容器在/code目录下执行python3 Main.py,但Main.py既不在/code目录(Dockerfile里复制到了/code/app),也没指定正确的挂载路径(你把本地./api挂载到了容器的/app),所以Python找不到文件,直接退出返回code 2。

  2. image与build字段冗余
    你同时指定了image: python:3.9和build字段,build会构建自己的镜像,image字段在这里会被忽略(或者说会用你构建的镜像覆盖这个指定),建议清理掉这个冗余配置。

修复方案(二选一即可)

方案1:移除docker-compose.yaml中的command字段

让容器使用Dockerfile里定义好的启动命令,路径是正确的。修改后的docker-compose.yaml:

version: "3.8"

services:
  api:
    restart: always
    build:
      dockerfile: ./api/Dockerfile
    volumes:
      - type: bind
        source: ./api
        target: /app
    ports:
      - 17002:17002

注意:如果想通过挂载卷实现本地代码热更新,需要把Dockerfile里的启动命令改成python3 /app/Main.py,这样会直接执行挂载目录里的代码。

方案2:修正docker-compose.yaml中的command路径

既然你挂载了本地./api到容器/app,直接指定正确的文件路径即可:

version: "3.8"

services:
  api:
    restart: always
    command: ["python3", "/app/Main.py"]
    build:
      dockerfile: ./api/Dockerfile
    volumes:
      - type: bind
        source: ./api
        target: /app
    ports:
      - 17002:17002

额外检查项

  • 确认Main.py里的FastAPI应用监听的是0.0.0.0:17002,而不是127.0.0.1,否则即使容器启动成功,外部也无法访问。示例:
    if __name__ == "__main__":
        import uvicorn
        uvicorn.run("Main:app", host="0.0.0.0", port=17002, reload=True)
    
  • 检查本地./api/requirements.txt是否包含FastAPI和uvicorn依赖,确保镜像构建时安装了必要包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:42:54