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

Docker部署Django项目报ModuleNotFoundError: No module named 'boto3'如何解决

问题根因
  1. 初始Dockerfile中使用RUN pip install boto3 -t .指令将boto3安装到了容器内的/app目录下,但后续的COPY . /app/、ADD . /app指令会用本地项目文件覆盖容器内/app路径下的内容,本地没有boto3的安装文件,直接导致构建阶段安装的boto3被覆盖丢失。
  2. docker-compose.yml中配置了volumes: - .:/app,会在容器启动时将本地项目目录完全挂载覆盖容器内的/app路径,就算构建阶段装到/app的依赖没有被COPY指令覆盖,启动时也会被本地目录覆盖消失。
  3. 第二个版本的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:24:03