Jupyter Notebook中运行Docker subprocess命令遇returncode=125错误求助
解决Docker subprocess返回code=125的问题
1. 先搞定--user参数的核心错误
你命令里的--user "id -u:id -g"是shell的命令替换语法,但subprocess.run默认不解析shell指令,Docker会把整个字符串当成用户ID,直接触发错误。两种解决方式:
方式一:启用shell模式(简单直接)
把命令改成字符串形式,加上shell=True参数,让shell帮你解析命令替换:
import subprocess license_key = "你的密钥" token = "你的令牌" cmd = f'docker run --rm -t --name stream -v /home/benson/OCR_project:/user-data/ --user $(id -u):$(id -g) -e LICENSE_KEY={license_key} -e TOKEN={token} platerecognizer/alpr-stream' result = subprocess.run(cmd, shell=True, capture_output=True, text=True) # 打印错误信息方便排查 print("标准输出:", result.stdout) print("错误输出:", result.stderr)
方式二:提前计算UID/GID(更安全)
用Python直接获取当前用户的UID和GID,避免shell注入风险:
import subprocess import os license_key = "你的密钥" token = "你的令牌" uid = os.getuid() gid = os.getgid() result = subprocess.run( ["docker", "run", "--rm", "-t", "--name", "stream", "-v", "/home/benson/OCR_project:/user-data/", "--user", f"{uid}:{gid}", "-e", f"LICENSE_KEY={license_key}", "-e", f"TOKEN={token}", "platerecognizer/alpr-stream"], capture_output=True, text=True ) print("标准输出:", result.stdout) print("错误输出:", result.stderr)
2. 处理Jupyter的TTY问题
-t参数会要求分配伪终端,但Jupyter单元格环境可能没有可用的TTY,导致Docker报错。可以直接去掉-t参数试试,或者换成-i(如果需要交互)。
3. 必须捕获错误输出
不管用哪种方式,都要加capture_output=True, text=True,这样能看到Docker返回的具体错误——比如路径不存在、权限不够这些问题,都能在stderr里找到线索。
4. 关于while循环的使用
如果要循环执行,注意每次运行前清理可能残留的容器(哪怕--rm会自动删除,异常退出时可能留坑),然后再启动新容器:
import subprocess import os import time license_key = "你的密钥" token = "你的令牌" uid = os.getuid() gid = os.getgid() while True: # 强制删除残留的stream容器,忽略不存在的错误 subprocess.run(["docker", "rm", "-f", "stream"], capture_output=True) # 运行ALPR命令 result = subprocess.run( ["docker", "run", "--rm", "--name", "stream", "-v", "/home/benson/OCR_project:/user-data/", "--user", f"{uid}:{gid}", "-e", f"LICENSE_KEY={license_key}", "-e", f"TOKEN={token}", "platerecognizer/alpr-stream"], capture_output=True, text=True ) print("本次运行返回码:", result.returncode) print("错误详情:", result.stderr) # 间隔10秒再重试,可根据需求调整 time.sleep(10)
额外排查点
- 确认
/home/benson/OCR_project路径真实存在,Jupyter用户有读写权限 - 检查
license_key和token变量有没有正确赋值,别是空字符串 - 在Jupyter单元格里跑
!docker ps,验证Docker是否在运行,当前用户有没有Docker操作权限
内容的提问来源于stack exchange,提问作者Tom Benson
相关产品推荐
相关产品推荐

