多阶段Docker构建Poetry管理FastAPI应用遇six.moves模块缺失错误
解决Docker构建中
six.moves模块缺失问题 问题背景
本地运行基于双仓库、Poetry管理的FastAPI应用流程如下:
$ cd data_sources $ poetry install $ poetry build $ cd .. $ cd api $ poetry install $ poetry build $ uvicorn api:app
其中data_sources是api的依赖,api的pyproject.toml引用data_sources/dist/*.whl文件。
执行docker build .时触发错误:
0.597 File "/opt/poetry/venv/lib/python3.12/site-packages/poetry/core/utils/_compat.py", line 8, in <module> 0.597 import six.moves.urllib.parse as urllib_parse 0.597 ModuleNotFoundError: No module named 'six.moves'
错误原因
- Poetry版本不兼容:
data_sources_builder阶段使用的Poetry 1.1.11为老旧版本,不支持Python 3.12,其核心代码依赖的six模块在Python 3.12环境中未被正确安装。 - 本地依赖传递缺失:原Dockerfile未将
data_sources构建生成的.whl文件复制到api_builder阶段,导致api安装依赖时无法引用本地包,触发旧Poetry版本的兼容性问题。 - 多阶段环境不一致:两个构建阶段混用不同版本的Poetry,增加了环境冲突风险。
修复方案
1. 统一Poetry版本
所有构建阶段使用兼容Python 3.12的Poetry版本(如1.8.2),消除版本差异带来的兼容性问题。
2. 传递本地构建包
在api_builder阶段复制data_sources生成的.whl文件,确保api能正确安装本地依赖。
3. 优化构建流程
使用poetry install --no-root避免提前安装未复制的源码,仅保留运行时必要文件,降低镜像体积。
最终Dockerfile
# 构建data_sources包 FROM python:3.12-slim AS data_sources_builder ENV POETRY_HOME=/opt/poetry \ POETRY_VERSION=1.8.2 \ PATH="/opt/poetry/bin:$PATH" RUN apt-get update \ && apt-get install -y --no-install-recommends curl build-essential \ && rm -rf /var/lib/apt/lists/* # 安装Poetry RUN curl -sSL https://install.python-poetry.org | python3 - WORKDIR /app/data_sources # 复制data_sources的配置文件 COPY data_sources/pyproject.toml data_sources/poetry.lock ./ # 安装依赖并构建包 RUN poetry install --no-root RUN poetry build # 构建api应用 FROM python:3.12-slim AS api_builder ENV POETRY_HOME=/opt/poetry \ POETRY_VERSION=1.8.2 \ PATH="/opt/poetry/bin:$PATH" RUN apt-get update \ && apt-get install -y --no-install-recommends curl build-essential \ && rm -rf /var/lib/apt/lists/* RUN curl -sSL https://install.python-poetry.org | python3 - WORKDIR /app/api # 复制api的配置文件 COPY api/pyproject.toml api/poetry.lock ./ # 从data_sources_builder复制构建好的whl文件 COPY --from=data_sources_builder /app/data_sources/dist /app/data_sources/dist # 安装api依赖(包括本地的data_sources包) RUN poetry install --no-root RUN poetry build # 最终运行镜像 FROM python:3.12-slim # 复制api构建好的包和依赖 COPY --from=api_builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages # 复制api的源代码 WORKDIR /app/api COPY api/ . EXPOSE 8000 CMD ["uvicorn", "api:app", "--host", "0.0.0.0", "--port", "8000"]
关键调整说明
- 所有阶段统一使用Poetry 1.8.2,确保与Python 3.12完全兼容。
- 在
api_builder阶段添加本地包复制步骤,让api的pyproject.toml能正确识别并安装data_sources依赖。 - 最终镜像仅保留运行所需的依赖和源码,减少冗余内容。
内容的提问来源于stack exchange,提问作者hydctrl
相关产品推荐
相关产品推荐

