Docker多阶段构建报错:uvicorn可执行文件未找到求助
问题原因
报错uvicorn: executable file not found in $PATH的核心原因有两个:
- 多阶段构建时,仅复制了base阶段的
/src目录,但Python包(包括uvicorn)是安装在base镜像的Python系统目录中,并未同步到alpine镜像里,导致alpine镜像中根本没有uvicorn可执行文件。 - docker-compose的卷挂载路径与容器内工作目录不匹配,本地
./src被挂载到/usr/src/app,但容器工作目录是/src,代码路径混乱。
解决步骤
1. 修正Dockerfile:同步Python依赖包
修改多阶段构建逻辑,将base阶段安装的Python包复制到alpine镜像中。推荐用pip install --target把包安装到指定目录,方便后续复制:
# pull official base image FROM python:3.11-slim AS base # set working directory WORKDIR /src # set environment variables ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 RUN apt-get update && apt-get install -y git RUN pip install --upgrade pip COPY ./requirements.txt . # 将依赖安装到src/packages目录,方便后续复制 RUN pip install --target ./packages -r requirements.txt FROM python:3.11-alpine WORKDIR /src # 从base阶段复制安装好的依赖包 COPY --from=base /src/packages /src/packages # 设置PYTHONPATH,让Python能找到packages里的依赖 ENV PYTHONPATH="/src/packages:$PYTHONPATH" # 复制本地代码到容器工作目录 COPY . .
2. 修正docker-compose.yml:对齐挂载路径
将卷挂载路径调整为与容器工作目录一致,避免代码路径混乱:
version: '3.8' services: web: build: context: . dockerfile: Dockerfile.test command: uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 8000 volumes: - ./src:/src # 对齐容器内的WORKDIR路径 ports: - 8000:8000
额外说明
如果你的requirements.txt中有依赖需要系统库支持(比如涉及编译的包),alpine镜像可能缺少对应的依赖,此时需要在alpine阶段安装必要的系统包,例如:
FROM python:3.11-alpine # 安装常用依赖,根据实际需求调整 RUN apk add --no-cache gcc musl-dev
内容的提问来源于stack exchange,提问作者tobias
相关产品推荐
相关产品推荐

