Как запустить монтирование тома docker как подпроцесс python? - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь запустить контейнер 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'

Я предполагаю, что это связано с экранированием от косой черты?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Когда вы звоните subprocess.run([...]), вы несете ответственность за разбиение команды на «слова». Здесь нет дальнейшей обработки; все передается точно , как у вас есть.

В частности, когда вы

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

Переданный аргумент в точности равен -v pwd..., включая пробел в единственном числе аргумент. Docker видит аргумент -v и анализирует оставшуюся часть этого "слова" как спецификацию тома, разбивая его на двоеточия, монтируя именованный том (с начальным пробелом) pwd на пути контейнера /data в read только режим. Поскольку (пробел) pwd не является допустимым именем тома, вы получаете эту ошибку.

Вы можете разбить это на два отдельных слова, чтобы устранить неоднозначность, или удалить промежуточный пробел.

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

(Как правило, лучше не запускать вещи как подпроцессы, если есть собственная библиотека или SDK с той же функциональностью. Вы можете попробовать запустить этот процесс, используя Docker Python SDK Вместо этого, помните, что очень просто использовать команду docker run для root всего хоста: будьте очень осторожны с тем, что вы запускаете и как обрабатываются командные строки.)

0 голосов
/ 08 апреля 2020

Не совсем так, как я это изложил, но, похоже, это работает:

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)
...