Docker容器配置FFmpeg及Python视频压缩报错排查求助
问题排查与解决方案
核心问题分析
1. subprocess调用格式错误
报错信息中显示找不到的是完整命令字符串,这是因为subprocess.run()默认以列表形式解析命令参数,直接传递完整字符串时,它会把整个串当作单个可执行文件路径查找,而非拆分命令和参数。
2. Docker容器内PATH冲突
Dockerfile中配置了虚拟环境,并将虚拟环境的PATH放在系统PATH之前,导致系统层面安装的ffmpeg不在当前执行环境的PATH中,即使安装完成也无法被识别。
修复步骤
步骤1:修正Python代码中的subprocess调用
修改compress函数,移除无用的文件打开操作,将命令拆分为列表形式传递,同时添加错误处理:
def compress(name): output = name[0:-4] + "-f" + ".mp4" # 以列表形式传递命令参数,确保subprocess正确解析 subprocess.run(["ffmpeg", "-i", name, "-vcodec", "libx264", output], check=True) video = cv2.VideoCapture(rtsp_url) fileName = saveToProjDir(video) compress(fileName)
- 列表形式的参数避免了
shell=True的安全风险,同时让subprocess能正确识别命令和每个参数 check=True会在ffmpeg执行失败时抛出异常,便于快速定位问题- 移除无意义的
with open(name) as f代码块,仅使用文件名即可完成压缩操作
步骤2:优化Dockerfile
Docker容器本身已是隔离环境,无需额外虚拟环境,同时调整安装顺序以减小镜像体积:
FROM python:3.11.0 WORKDIR /app/ # 先安装系统依赖,清理缓存减小镜像体积 RUN apt-get update && apt-get install -y ffmpeg libsm6 libxext6 && rm -rf /var/lib/apt/lists/* COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt ADD main.py . CMD ["python", "/app/main.py"]
- 移除虚拟环境相关配置,彻底解决PATH冲突问题
- 合并
apt-get命令并清理缓存,符合Docker镜像构建的最佳实践 - 先安装系统依赖再安装Python依赖,确保opencv等库能正常调用系统级组件
额外验证建议
- 进入容器手动执行
ffmpeg -version,确认命令可正常运行:docker exec -it <容器ID> /bin/bash ffmpeg -version - 检查
saveToProjDir函数生成的文件路径,确保视频文件确实保存在容器内的/app目录下
内容的提问来源于stack exchange,提问作者TorR
相关产品推荐
相关产品推荐

