Docker部署Django项目报ModuleNotFoundError: No module named 'boto3'如何解决
问题根因
- 初始Dockerfile中使用
RUN pip install boto3 -t .指令将boto3安装到了容器内的/app目录下,但后续的COPY . /app/、ADD . /app指令会用本地项目文件覆盖容器内/app路径下的内容,本地没有boto3的安装文件,直接导致构建阶段安装的boto3被覆盖丢失。 - docker-compose.yml中配置了
volumes: - .:/app,会在容器启动时将本地项目目录完全挂载覆盖容器内的/app路径,就算构建阶段装到/app的依赖没有被COPY指令覆盖,启动时也会被本地目录覆盖消失。 - 第二个版本的Dockerfile存在指令顺序错误,先执行
ADD . /app再拷贝requirements.txt安装依赖,会导致如果本地requirements.txt更新不及时、或者本地文件有冲突时,依赖安装不符合预期。
解决方案
按以下步骤操作即可解决:
- 首先确认本地的
requirements.txt中已经添加了boto3依赖,可执行pip freeze | grep boto3确认版本后写入,示例:boto3==1.28.0 django==4.2.0 # 其他依赖保持不变 - 修正Dockerfile配置,删除冗余指令,调整指令顺序,不要将依赖安装到
/app目录:FROM python:3 ENV PYTHONUNBUFFERED 1 WORKDIR /app # 先拷贝依赖文件,利用Docker层缓存避免每次改代码都重装依赖 COPY ./requirements.txt /app/requirements.txt RUN pip install --no-cache-dir -r requirements.txt # 最后拷贝项目代码 COPY . /app/ CMD [ "python", "manage.py", "runserver", "0.0.0.0:8000" ] - 调整docker-compose.yml配置:
如果不需要本地开发热重载,直接删除volumes字段即可:
如果需要保留热重载用于开发,保持version: '3' services: web: build: . command: python manage.py runserver 0.0.0.0:8000 ports: - "8000:8000"volumes配置即可,因为依赖已经安装到容器系统的Python站点包路径,不会被/app的挂载覆盖。 - 项目根目录新建
.dockerignore文件,添加以下内容避免不必要的文件拷贝到容器:__pycache__ *.pyc *.pyo *.pyd .env venv .git .gitignore - 最后执行带重新构建参数的启动命令,避免使用旧的缓存镜像:
docker-compose up --build
内容的提问来源于stack exchange,提问作者lanam
相关产品推荐
相关产品推荐

