EDIT(Update): 通过不断的搜索和测试,我发现问题似乎出在 $PWD (或 $(dirs -l) 或 $(pwd) ) 被 docker 解释为相对路径,尽管实际上是绝对路径。
然而,$PWD、$(dirs -l)、$(pwd) 的复制然后粘贴输出仍然可以完美运行。这个终端打印输出与 bash 传递给 docker 的相同变量有何不同?
请耐心等待,我对任何类型的脚本编写都很陌生。因此,我不仅确定此脚本中存在明显的冗余,而且我还可能遗漏了一些基本的东西。
我编写了一个小的 bash 脚本,试图将从 Docker 容器运行 OCRmyPDF 所需的冗长命令转换为更易于管理的命令。这是实现此目的的长命令(根据创建者的 github):
docker run -t -i -v "</path/to/pdfdir>:/home/docker/" paulstaab/ocrmypdf \
OCRmyPDF <additional options> <pdf> <out.pdf>
我的目标是制作一个名为 ocrmypdf 的脚本,它将采用一个命名的 .pdf 和任何指定的参数,对 pdf 文件进行 OCR,并输出一个带有原始名称的文件'_ocr' 尾部。
这是我对 bash 脚本的尝试(脚本名称 - ocrmypdf):
#!/bin/bash
#docker ocrmypdf ease-of-use script
BASENAME=$(basename "$1")
BASENOSUFFIX=$(basename -s .pdf "$1")
DIRECTORY=$(dirs -l):/home/docker/
docker run -t -i -v \"$DIRECTORY\" paulstaab/ocrmypdf \ OCRmyPDF $2 \"$BASENAME\" \""$BASENOSUFFIX"_OCR.pdf\"
我知道在这么简单的脚本中可能不一定需要变量,但我在进行故障排除时已经实现了它们。
问题是,当我运行脚本时,专注于我知道该程序能够进行 OCR 的 .pdf 文件,我返回了错误:
FATA[0000] Error response from daemon: cannot bind mount volume: "/home/blue/Documents/PDF/Massumi/1995 volume paths must be absolute.
但是,令我困惑的是,如果我“回显”脚本的最后一行“docker run -t ...”,回显 输出在复制到终端时会完美运行.例如,...的输出 (最后一行回显)
./ocrmypdf test.pdf -f
是('-f' 强制 ocrmypdf 对 .pdf 进行 ocr 而不管已经扫描的文本)
docker run -t -i -v "/home/blue/Documents/PDF/Massumi/1995:/home/docker/" paulstaab/ocrmypdf OCRmyPDF -f "test.pdf" "test_OCR.pdf"
其中,如果粘贴回终端,则成功对“test.pdf”进行 OCR。但是,当脚本在没有最后一行 echoed 的情况下运行时,我收到上面列出的“无法绑定(bind)安装卷”错误。
最佳答案
我认为问题在于您的 DIRECTORY
变量。
尝试在声明中的 :
前面放一个反斜杠,例如 DIRECTORY=$(dirs -l)\:/home/docker/
。
为了安全起见,您应该始终将变量用双引号引起来,在这种情况下,您的 中的
命令。$DIRECTORY
、$2
和 $BASENAME
docker
关于linux - 通过 Docker 调用 OCRmyPDF 的 bash 脚本的错误响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30207983/