Docker部署Django时生成存储QR码提示文件/目录不存在
问题解决:Docker部署时无法创建二维码文件
问题核心
本地运行正常但Docker部署报错,本质是容器内的/app/static/QR目录不存在。本地环境中该目录可能已手动创建或之前运行程序时自动生成,但Docker容器是全新环境,默认不会自动生成这个目录,直接调用open()写文件时会因父目录不存在抛出No such file or directory错误。
解决方案
方案1:在Dockerfile中提前创建目录
构建镜像时直接创建目标目录,确保容器启动后目录存在:
# 添加到Dockerfile中,放在COPY或安装依赖的步骤之后 RUN mkdir -p /app/static/QR
如果容器使用非root用户运行,需同步设置目录权限:
RUN mkdir -p /app/static/QR && chown -R your_app_user:your_app_user /app/static/QR
方案2:在Python代码中自动创建目录
在写入文件前,先检查并创建目录(兼容本地和Docker环境):
import os from django.conf import settings # 原有代码 nombre_archivo = f'QR-{request.user.instituto.id}-{idRecibo}.png' UPLOADS_PATHS = os.path.join(settings.QR_ROOT, nombre_archivo) # 创建目录(exist_ok=True避免目录已存在时报错) os.makedirs(settings.QR_ROOT, exist_ok=True) with open(UPLOADS_PATHS, 'wb') as f: f.write(response.content)
额外注意点
- 原
QR_ROOT = os.path.join(BASE_DIR, 'static/QR')的定义是正确的,添加./不会解决目录不存在的问题 - 确认
BASE_DIR在Docker环境中指向/app(Django默认的BASE_DIR定义通常无需修改)
内容的提问来源于stack exchange,提问作者Santiago Dellacasa
相关产品推荐
相关产品推荐

