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

多阶段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'

错误原因

  1. Poetry版本不兼容:data_sources_builder阶段使用的Poetry 1.1.11为老旧版本,不支持Python 3.12,其核心代码依赖的six模块在Python 3.12环境中未被正确安装。
  2. 本地依赖传递缺失:原Dockerfile未将data_sources构建生成的.whl文件复制到api_builder阶段,导致api安装依赖时无法引用本地包,触发旧Poetry版本的兼容性问题。
  3. 多阶段环境不一致:两个构建阶段混用不同版本的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:38:18