使用Turborepo构建Monorepo时Docker容器出现dotenv模块缺失错误
问题场景
在Turborepo管理的Monorepo项目中,构建apps/sync-sheet Python应用的Docker容器时,运行报错找不到dotenv模块。尽管requirements.txt已声明python-dotenv==1.0.0,且本地环境运行正常。
错误信息
Traceback (most recent call last): File "/app/services/sheet-sync/main.py", line 1, in <module> from src.reads.supplier_info import build as build_suppliers File "/app/services/sheet-sync/src/reads/supplier_info.py", line 1, in <module> from src.reads.read_data_from_sheet import read_data_from_sheet File "/app/services/sheet-sync/src/reads/read_data_from_sheet.py", line 1, in <module> from src.config.google_config import sheets File "/app/services/sheet-sync/src/config/google_config.py", line 2, in <module> from dotenv import load_dotenv ModuleNotFoundError: No module named 'dotenv'
项目结构
. ├── README.md ├── docker-compose.yml ├── node_modules ├── package.json ├── apps │ └── sync-sheet │ ├── Dockerfile │ ├── Makefile │ ├── creds.json │ ├── googleSheetENV │ ├── main.py │ ├── package.json │ ├── requirements.txt │ └── src ├── packages ├── tsconfig.json ├── turbo.json └── yarn.lock
解决思路
检查Dockerfile的依赖安装步骤
确认Dockerfile中是否包含RUN pip install -r requirements.txt(或pip3,避免Python2环境冲突),且该步骤在复制应用代码之后执行。若依赖安装在代码复制前,可能因Docker缓存导致新依赖未生效。可添加--no-cache-dir强制重新安装,或指定PyPI源加速:WORKDIR /app/apps/sync-sheet COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple COPY . .验证requirements.txt路径正确性
确保Docker构建时requirements.txt被复制到正确的工作目录下。如果在项目根目录执行构建命令(docker build -f apps/sync-sheet/Dockerfile .),需在Dockerfile中明确指定复制路径:COPY apps/sync-sheet/requirements.txt /app/apps/sync-sheet/ WORKDIR /app/apps/sync-sheet RUN pip install -r requirements.txt确认Python环境一致性
检查Docker镜像使用的Python版本与本地是否匹配(比如本地用Python3.9,Docker镜像用python:3.9-slim),避免因版本差异导致依赖安装异常。同时确保使用对应版本的pip(如pip3)。验证依赖安装结果
在Dockerfile中添加调试步骤,查看依赖是否成功安装:RUN pip show python-dotenv RUN pip list | grep dotenv若输出为空,说明依赖未安装成功,需排查网络或源的问题。
检查Python模块导入路径
确保应用所在目录被加入Python路径。可在Dockerfile中设置环境变量:ENV PYTHONPATH=/app/apps/sync-sheet或在启动命令前临时设置:
PYTHONPATH=/app/apps/sync-sheet python main.py
内容的提问来源于stack exchange,提问作者Roni Jack Vituli

