使用docker-compose启动FastAPI应用失败:api容器退出码2
exited with code 2的问题 首先,先获取容器的详细错误日志,这是定位问题的关键:
docker-compose logs api
根据你提供的配置,大概率是命令执行路径不匹配导致的,下面是具体问题和修复方案:
核心问题分析
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。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

