使用Docker+Poetry启动FastAPI项目失败:uvicorn命令未找到
问题原因
Poetry 默认会为项目创建独立的虚拟环境,你通过 poetry install 安装的 uvicorn 被放在了这个虚拟环境的可执行目录中,而容器的默认 Shell 没有将这个目录加入 PATH,所以直接运行 uvicorn 会提示找不到命令。
解决方案
下面提供两种常用的解决方式,任选其一即可:
方式一:用 poetry run 执行命令
修改 docker-compose.yaml 中 backend 服务的 command,通过 poetry run 激活虚拟环境并启动 uvicorn:
backend: build: context: backend command: bash -c 'poetry run uvicorn src.presentation.main:app --host 0.0.0.0 --port 8000 --reload' # 其他配置保持不变
方式二:让 Poetry 安装到系统 Python 环境
修改 backend/Dockerfile,禁用 Poetry 的虚拟环境创建功能,让依赖直接安装到容器的系统 Python 环境中:
FROM python:3.11-slim WORKDIR /backend COPY . /backend RUN pip install --upgrade pip && pip install poetry # 禁用虚拟环境 RUN poetry config virtualenvs.create false # 安装依赖(--no-root 可选,若不需要安装当前项目包则添加) RUN poetry install EXPOSE 8000
修改后,docker-compose.yaml 中的 command 可以保持原来的写法,直接运行 uvicorn 即可找到命令。
额外注意事项
你的 docker-compose.yaml 中给 backend 服务挂载了本地目录 - .:/backend,这会覆盖容器内 /backend 目录的内容。如果本地没有 Poetry 虚拟环境,或者虚拟环境路径不一致,可能会引发其他问题。如果是开发环境需要热重载,可以保留挂载,但建议确保本地和容器的 Poetry 配置一致;如果是生产环境,建议移除这个挂载卷,避免依赖环境混乱。
内容的提问来源于stack exchange,提问作者Mihail Bury
相关产品推荐
相关产品推荐

