Conda环境下Django项目迁移Docker容器的问题排查
Conda管理的Django项目Docker部署方案
问题概述
- 学习参考:William S. Vincent所著《Django for Professionals 3.1》
- 本地环境:Mac系统 + PyCharm IDE + Conda虚拟环境运行Django项目
- 原书基于pipenv的Docker配置无法适配Conda依赖模式,自行配置时遇到两个阻断性问题:
- 构建镜像阶段:本地无
run.py文件,触发failed to compute cache key: "/run.py" not found报错 - 容器启动阶段:注释run.py相关配置后,触发
ModuleNotFoundError: No module named 'django'报错,本质是容器内Conda虚拟环境未自动激活
- 构建镜像阶段:本地无
分步操作指南
1. 修正Conda依赖清单
之前导出依赖时移除容器无法解析的libcxx=12.0.0操作正确,额外需要确认导出的environment.yml文件头部明确指定环境名称,避免Conda创建环境时名称异常:
name: django_app # 自定义你的环境名称,后续配置会用到 channels: - conda-forge - defaults dependencies: - python=3.x # 替换为你本地项目实际使用的Python版本 # 此处保留你导出的所有除libcxx外的conda安装依赖 - pip: # 此处列出所有通过pip安装的依赖,比如Django及相关第三方包
如果担心导出的依赖有冗余,也可以手动精简,只保留项目实际import用到的包即可。
2. 编写无run.py依赖的Dockerfile
不需要依赖额外的run.py脚本激活Conda环境,直接通过Docker内置的SHELL指令配置全局默认使用目标Conda环境,从根源避免两个报错,参考配置如下:
# 选用官方Miniconda基础镜像 FROM continuumio/miniconda3:latest # 设置容器内工作目录 WORKDIR /usr/src/app # 先复制依赖文件,利用Docker构建缓存减少重复构建时间 COPY environment.yml . # 创建Conda虚拟环境,安装所有依赖,安装完成后清理缓存减小镜像体积 RUN conda env create -f environment.yml && \ conda clean --all -y # 核心配置:替换django_app为你environment.yml中指定的环境名,后续所有命令默认在该Conda环境内执行 SHELL ["conda", "run", "-n", "django_app", "/bin/bash", "-c"] # 复制项目全部代码到容器 COPY . . # 直接指定Django启动命令,不需要通过run.py中转 CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
3. 调整docker-compose.yml配置
不需要额外配置环境激活指令,直接配置端口映射、目录挂载即可,参考配置:
version: "3.9" services: web: build: . volumes: - ./:/usr/src/app ports: - "8000:8000" # 如果需要启动时自动执行数据库迁移,可以放开下面的command配置 # command: > # sh -c "python manage.py migrate && # python manage.py runserver 0.0.0.0:8000"
验证流程
- 执行
docker-compose build --no-cache重新构建镜像,不会再出现找不到run.py的报错 - 执行
docker-compose up启动容器,终端会正常输出Django服务启动日志,本地访问http://127.0.0.1:8000即可正常访问项目 - 若需要验证环境是否正确,可以执行
docker-compose exec web python -c "import django; print(django.get_version())",能正常输出版本号即代表环境配置正确
内容的提问来源于stack exchange,提问作者dbjax
相关产品推荐
相关产品推荐

