运行Docker镜像时遇ModuleNotFoundError:找不到oauth2client模块
Dockerfile内容
FROM python:3.10-slim ENV PYTHONUNBUFFERED=1 # 创建工作目录 RUN mkdir -p /src COPY ./drive-upload-python/ /src/drive-upload-python/ WORKDIR /src/drive-upload-python/ # 安装依赖 RUN pip install --user --upgrade pip RUN pip install --user -r requirements.txt ENV PYTHONPATH "${PYTHONPATH}:/root/.local:/root/.local/lib/python3.10/site-packages:/root/.local/bin:/root/src" RUN echo $PYTHONPATH ENTRYPOINT [ "python","drive_upload.py" ] CMD [ "default-arg" ]
项目结构
drive-upload-python - creds -- credentials.py -- creds.json - drive_upload.py - other.py - requirements.txt
requirements.txt内容
google-api-python-client google-auth-httplib2 google-auth-oauthlib psycopg2-binary oauth2client
构建命令
sudo docker build --network=host -t drive-uploader . --progress=plain
运行错误信息
Traceback (most recent call last):
File "/src/drive-upload-python/drive_upload.py", line 9, in
from creds.credentials import get_service
File "/src/drive-upload-python/creds/credentials.py", line 6, in
from oauth2client.service_account import ServiceAccountCredentials
ModuleNotFoundError: No module named 'oauth2client'
已尝试的操作
- 配置PYTHONPATH和PATH包含
/root/.local相关路径,未解决问题; - 进入容器交互shell,确认
google-auth-oauthlib安装在/root/.local/lib/python3.10/site-packages,该路径已加入环境变量,但问题依旧。
解决方法
核心问题是使用pip install --user安装依赖导致的路径识别问题,Docker容器环境下推荐直接安装到系统Python路径,具体调整如下:
1. 修改Dockerfile移除--user参数
将依赖安装部分的--user去掉,这样包会安装到系统默认的Python路径,无需额外配置PYTHONPATH:
# 安装依赖 RUN pip install --upgrade pip RUN pip install -r requirements.txt
同时可以删除ENV PYTHONPATH ...这一行,因为系统路径会被Python自动识别。
2. 验证依赖安装完整性
重新构建镜像时,通过--progress=plain查看安装日志,确认oauth2client被成功安装,避免因网络问题导致的安装遗漏。
3. (可选)若坚持使用--user
需确保容器运行时用户为root(默认即为root),且PYTHONPATH在运行时正确生效。但这种方式在Docker环境下容易引发路径问题,不推荐。
调整后重新构建并运行镜像,即可解决模块找不到的问题。
内容的提问来源于stack exchange,提问作者Saurabh Saxena

