Docker化Django应用报错:找不到kafka.vendor.six.moves模块
问题:Docker化Django应用中kafka-python模块找不到
kafka.vendor.six.moves 环境信息
Dockerfile
FROM python:alpine ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 ENV DJANGO_SUPERUSER_PASSWORD datahub RUN mkdir app WORKDIR /app COPY ./app . RUN mkdir -p volumes RUN apk update RUN apk add --no-cache gcc python3-dev musl-dev mariadb-dev RUN pip3 install --upgrade pip RUN pip3 install -r requirements.txt RUN apk del gcc python3-dev musl-dev CMD python3 manage.py makemigrations --noinput &&\ while ! python3 manage.py migrate --noinput; do sleep 1; done && \ python3 manage.py collectstatic --noinput &&\ python3 manage.py createsuperuser --user datahub --email admin@localhost --noinput;\ python3 manage.py runserver 0.0.0.0:8000
requirements.txt
kafka-python==2.0.2
错误信息
ModuleNotFoundError: No module named 'kafka.vendor.six.moves'
完整错误栈:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.12/site-packages/kafka/__init__.py", line 23, in <module> from kafka.consumer import KafkaConsumer File "/usr/local/lib/python3.12/site-packages/kafka/consumer/__init__.py", line 3, in <module> from kafka.consumer.group import KafkaConsumer File "/usr/local/lib/python3.12/site-packages/kafka/consumer/group.py", line 13, in <module> from kafka.consumer.fetcher import Fetcher File "/usr/local/lib/python3.12/site-packages/kafka/consumer/fetcher.py", line 19, in <module> from kafka.record import MemoryRecords File "/usr/local/lib/python3.12/site-packages/kafka/record/__init__.py", line 1, in <module> from kafka.record.memory_records import MemoryRecords, MemoryRecordsBuilder File "/usr/local/lib/python3.12/site-packages/kafka/record/memory_records.py", line 27, in <module> from kafka.record.legacy_records import LegacyRecordBatch, LegacyRecordBatchBuilder File "/usr/local/lib/python3.12/site-packages/kafka/record/legacy_records.py", line 50, in <module> from kafka.codec import ( File "/usr/local/lib/python3.12/site-packages/kafka/codec.py", line 9, in <module> from kafka.vendor.six.moves import range ModuleNotFoundError: No module named 'kafka.vendor.six.moves'
解决方案
问题根源是kafka-python 2.0.2版本过于老旧,与Python 3.12不兼容——Python 3.12移除了部分six库相关的兼容逻辑,而老版本kafka-python依赖自带的six模块,导致导入失败。以下是三种解决办法,优先推荐前两种:
方案一:升级kafka-python到兼容Python 3.12的版本
修改requirements.txt,将kafka-python版本更新到支持Python 3.12的版本(比如2.2.0及以上):
kafka-python==2.2.0
或者直接指定兼容范围:
kafka-python>=2.2.0,<3.0.0
然后重新构建Docker镜像:
docker build -t your-django-app .
方案二:降级Python版本到与kafka-python 2.0.2兼容的版本
如果必须保留kafka-python 2.0.2,将Dockerfile的基础镜像换成Python 3.11-alpine(该版本与kafka-python 2.0.2兼容):
修改Dockerfile第一行:
FROM python:3.11-alpine
重新构建镜像即可。
方案三:手动修改依赖导入(不推荐,hack方式)
若坚持使用Python 3.12和kafka-python 2.0.2,可通过以下步骤临时修复:
- 在
requirements.txt中添加six依赖:
kafka-python==2.0.2 six==1.16.0
- 在Dockerfile的
RUN pip3 install -r requirements.txt之后添加命令,修改kafka模块的导入语句:
RUN sed -i 's/from kafka.vendor.six.moves import range/from six.moves import range/' /usr/local/lib/python3.12/site-packages/kafka/codec.py
注意:此方法仅修复当前报错的导入,后续可能出现其他兼容问题,且容器重建后需重新执行修改,不建议长期使用。
内容的提问来源于stack exchange,提问作者Navid Sadeghi
相关产品推荐
相关产品推荐

