如何将docker卷装载作为python子进程运行?

2024-04-24 14:39:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试运行docker容器,具体地说openalpr可以在这里找到:

https://hub.docker.com/r/openalpr/openalpr/

docker run -it --rm -v $(pwd):/data:ro openalpr -c us plateTest1.jpg

尝试将此命令作为子进程运行时,我在python中遇到错误:

导入子流程

app.py

result = subprocess.run(['docker', 'run', '-it', '--rm', '-v pwd:/data:ro', 'openalpr', '-c us', 'plateTest1.jpg'], capture_output=True)
print(result.stdout)
print(result.stderr)

以下是我得到的错误:

(base) mac@macs-MBP lpr % python openalpr_test.py
b''
b'docker: Error response from daemon: invalid volume specification: \' pwd:data:ro\': invalid mount config for type "volume": invalid mount path: \'data\' mount path must be absolute.\nSee \'docker run --help\'.\n'

我想这与逃逸斜杠有关


Tags: dockerrmrundataro错误pwdit
2条回答

不完全是我设计的方式,但这似乎有效:

from subprocess import Popen
import subprocess

command='''
docker run -it  rm -v $(pwd):/data:ro openalpr -c us plateTest1.jpg
'''
process=Popen(command,shell=True,stdout=subprocess.PIPE)
result=process.communicate()
print(result)

当您调用subprocess.run([...])时,您负责将命令分解为“单词”。这里没有进一步的处理;一切都按你的方式传递

特别是当你

subprocess.run([..., '-v pwd:/data:ro', ...])

传递的参数正好是-v pwd...,包括单个参数中的空格。Docker看到一个-v参数,并将这个“单词”的其余部分解析为卷规范,在冒号上打破它,因此以只读模式在容器路径/data上挂载一个命名卷(带前导空格)pwd。由于(space)pwd不是有效的卷名,因此会出现此错误

您可以将其拆分为两个单独的单词来消除歧义,或者删除中间的空格

subprocess.run([..., '-v', 'pwd:/data:ro', ...])
subprocess.run([..., '-vpwd:/data:ro', ...])

(通常,如果存在具有相同功能的本机库或SDK,则最好避免将其作为子进程启动。您可以尝试使用Docker Python SDK来运行此进程。请记住,使用docker run非常容易要在整个主机上设置根目录的命令:要非常小心要启动什么以及如何处理命令行。)

相关问题 更多 >