Docker容器中subprocess异常:Django+Celery文档转换问题求助
解决Celery容器中subprocess调用LibreOffice转PDF失败的问题
我之前在容器化部署Django+Celery处理Office转PDF时也踩过不少坑,结合你的场景,给你几个具体的排查和解决方向:
确认Celery容器是否安装了LibreOffice及依赖
容器是完全隔离的环境,Django容器装了LibreOffice不代表Celery容器也有。你需要检查Celery的Dockerfile里是否包含安装命令:- 基于Debian/Ubuntu的镜像:
RUN apt-get update && apt-get install -y libreoffice libreoffice-writer fonts-dejavu-core(字体包是避免转换后PDF空白/乱码的关键) - 基于Alpine的镜像:
RUN apk add --no-cache libreoffice libreoffice-writer ttf-dejavu
安装完成后,进入Celery容器执行libreoffice --version确认安装成功。
- 基于Debian/Ubuntu的镜像:
使用绝对路径调用LibreOffice命令
容器内的LibreOffice可执行文件路径可能和本地不同,比如部分环境下是soffice而非libreoffice。你可以在Celery容器内执行which libreoffice或which soffice拿到绝对路径,然后在代码中替换:import subprocess from pathlib import Path from django.conf import settings def convert_office_to_pdf(file_path): file_path = Path(file_path) output_dir = settings.MEDIA_ROOT / "converted" output_dir.mkdir(exist_ok=True) # 用容器内实际的绝对路径替换 cmd = [ "/usr/bin/libreoffice", "--headless", "--convert-to", "pdf", "--outdir", str(output_dir), str(file_path) ] result = subprocess.run(cmd, capture_output=True, text=True) # 打印日志便于排查问题 print(f"转换命令输出:STDOUT={result.stdout}, STDERR={result.stderr}") if result.returncode != 0: raise Exception(f"PDF转换失败:{result.stderr}") return output_dir / f"{file_path.stem}.pdf"检查文件路径与容器挂载权限
- 确保用户上传的
original文件夹通过Docker Volume挂载到了Celery容器,并且挂载路径和Django容器完全一致(比如都挂载为/app/media/original) - 检查Celery进程的运行用户是否对该文件夹有读写权限:可以在Dockerfile中添加
RUN chown -R www-data:www-data /app/media(假设Celery用www-data用户运行) - 所有文件路径尽量使用绝对路径,避免相对路径导致的找不到文件问题(比如用
settings.MEDIA_ROOT / "original" / filename代替./original/filename)
- 确保用户上传的
捕获并查看subprocess的详细错误
很多时候subprocess失败是因为没输出错误信息,你一定要捕获stdout和stderr,并在Celery日志中查看。比如上面代码中的打印语句,或者用Celery的日志系统记录这些信息,这样能快速定位是命令不存在、文件找不到还是依赖缺失。手动在Celery容器中测试转换命令
进入Celery容器(docker exec -it <celery-container-id> /bin/bash),找一个测试用的Word文件,手动执行转换命令:libreoffice --headless --convert-to pdf /app/media/original/test.docx --outdir /app/media/converted如果手动执行也失败,那就是容器环境的问题;如果手动成功,那就是代码中的路径或参数问题。
内容的提问来源于stack exchange,提问作者alpha787
相关产品推荐
相关产品推荐

