У меня проблемы с запуском bash-скрипта, который открывает докер-контейнер в интерактивном режиме и выполняет некоторые команды

Технически вы можете использовать столько отдельных соединений, сколько хотите, в то время как ваша проблема вызвана простой опечаткой - вы не можете использовать ресурсы только из одного расширения с функциями из другого, что вполне очевидно.

Однако вам следует избегать нескольких подключений от одного и того же сценария, независимо от одного API или другого. Поскольку это будет обременять ваш сервер базы данных и исчерпывать его ресурсы. Итак, хотя технически вы можете, вы не должны смешивать разные расширения в своем коде, за исключением короткого периода рефакторинга.

0
задан WaterKnight 24 March 2019 в 17:33
поделиться

2 ответа

Здесь есть несколько проблем с вашим скриптом:

Ошибки \r, такие как:

запуск процесса контейнера вызвал "exec: \" bash \ r \ ": исполняемый файл не найден в $ PATH": неизвестно

И другие подобные ошибки связаны: \r указывает на возврат каретки Windows в вашем скрипте - это было возможно, написано в Windows и смонтировано в виртуальной машине, или ваш редактор каким-то образом добавил эти символы (см. в этом посте ). Linux ожидает только \n и рассматривает \r как часть вашей команды. Попробуйте запустить dos2unix для вашего файла или убедитесь, что нет специальных символов.


Кроме того, у скрипта есть несколько проблем:

  • Вы пытаетесь запустить docker exec, который запускает команду bash, которая cd и запускает скрипт на python. [ 1119] Это можно немного упростить (см. Ниже)
  • Вы хотите запустить Python, вероятно, нет необходимости сначала запускать bash, вы можете запустить команду python напрямую
  • Учитывая, что вы хотите запустить 2 команды Python, вам потребуются разрывы строк, это возможно, но не очень удобно . Было бы лучше создать скрипт Python и смонтировать его в образе, прежде чем запускать простую команду python.
  • Также было бы лучше использовать docker exec -w flag вместо использования команды cd для установки рабочего каталога
  • Нет необходимости в exit или exit (), так как это будет сделано неявно, когда больше не будет никаких инструкций, которые нужно выполнить

Учитывая все это, вы можете:

  • выполнить одну команду, такую ​​как [1134 ]

    docker exec [...] -it -w /scriptsIA dbmobilelife/docker-python-opencv-tesseract \
         echo -e "from SegmentarImagen import *\nextraerNombreUsuarioNiveldeUnaFoto("/imgsIA/andres.jpg")" | python
    

    , в котором вы устанавливаете рабочий каталог с помощью -w и запускаете команду Python, передавая ее содержимое через echo и канал (обратите внимание на \n без пробела, чтобы иметь правильный синтаксис Python)

  • создать скрипт myscript.py, например:

    from SegmentarImagen import *
    extraerNombreUsuarioNiveldeUnaFoto("/imgsIA/andres.jpg")
    

    , затем смонтировать этот скрипт в контейнер и запустить простую команду python:

    docker exec [...] -it -w /scriptsIA -v /path/to/myscript.py:/myscript.py \
       dbmobilelife/docker-python-opencv-tesseract \
       python /myscript.py
    

Примечание: [...] предназначены для объемного крепления -v /scriptsIA:/scriptsIA -v /opt/tomcat/webapps/PokeTrainer/imgIA:/imgsIA, которое я вырезал для упрощения

0
ответ дан Pierre B. 24 March 2019 в 17:33
поделиться

Ваша проблема не очень ясна, и я не могу вытащить ваш образ докера, так что я немного догадываюсь, но мне кажется, что вы в своем скрипте bash пытаетесь:

  • запустить Докер контейнер
  • внутри контейнера, откройте оболочку Python
  • Запустите скрипт Python в оболочке Python

, и это может быть немного, чтобы спросить из файла sh.

Видите ли, скрипт bash - это не список команд, которые ваша ОС запускает одну за другой. когда вы запускаете скрипт bash, это процесс , и у него есть свои правила.

Если вы хотите выполнить все эти задачи одной командой, вам придется разбить ваш скрипт на части:

скрипт python:

//run_python.py

#!/usr/bin/env python

from SegmentarImagen import *
extraerNombreUsuarioNiveldeUnaFoto("/imgsIA/andres.jpg")
exit()

поместите этот скрипт в / scriptsIA dir на вашем хосте, поэтому он будет доступен в контейнере через том.

//run_container.sh

#!/bin/bash

//a cmd var- this is the command we will be executing inside the container:

cmd=cd /scriptsIA/ && python run_python.py

 docker run
 -v /scriptsIA:/scriptsIA
 -v /opt/tomcat/webapps/PokeTrainer/imgIA:/imgsIA
 -it dbmobilelife/docker-python-opencv-tesseract $cmd 

Теперь вы легко запускаете ./run_container.sh, чтобы оживить все это. удачи!

0
ответ дан Efrat 24 March 2019 в 17:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: