Передать аргумент скрипту Python, выполняющемуся в Docker-контейнере - PullRequest
0 голосов
/ 18 декабря 2018

Предположим, следующие настройки:

  • Веб-сайт, написанный на php / laravel
  • Пользователь загружает файл (либо text / doc / pdf)
  • У нас естьКонтейнер Docker, который содержит скрипт Python для преобразования текста в массив numpy.

Я хочу взять эти загруженные данные и передать их скрипту Python.

Я не могу найтивсе, что объясняет, как передавать динамически сгенерированные входные данные в контейнер.

Можно ли это сделать, выполнив сценарий оболочки из приложения laravel, которое содержит загруженный файл в качестве переменной, указанной в ENTRYPOINT файла dockerfile?

Есть ли другие способы сделать это?

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Я бы настоятельно рекомендовал использовать tcp / ip для таких целей.Кстати, в этом случае вы получаете следующие преимущества:

  • Вы можете определить, работает ли ваш сервис python
  • . Вы можете переместить контейнер python на другой компьютер

Реализация действительно проста.Вы можете выбрать любой фреймворк, но для меня подходит Twisted, и реализовать свой скрипт на Python следующим образом:

from twisted.internet.protocol import Factory, Protocol
from twisted.protocols.basic import LineReceiver

class DataProcessor(LineReceiver):
  def lineReceived(self, line):
    # line contains your data
    pass

Factory factory = Factory()
factory.protocol = DataProcessor
reactor.listenTCP(8080, factory)
0 голосов
/ 18 декабря 2018

... скрипт python для ...

Просто запустите его;не упаковывайте его в контейнер Docker.Это вдвойне верно, если его входы и выходы являются локальными файлами, и он ожидает, что сделает свое дело и выйдет быстро: изоляция файловой системы, которую обеспечивает Docker, работает против вас.


Это, конечно, техническивозможный.В зависимости от того, как именно установлен контейнер вспомогательной программы, «команда» в конце docker run будет видна скрипту Python в sys.argv, как и любые другие параметры командной строки.Вы можете использовать опцию docker run -v для публикации частей файловой системы хоста в контейнере.Таким образом, вы можете запустить что-то вроде

docker run --rm -v $PWD/files:/data \
  converter_image \
  python convert.py /data/in.txt /data/out.pkl

, где все пути /data находятся в пространстве частной файловой системы контейнера.

Есть два больших предостережения:

  1. Пути к хосту в опции docker run -v - это пути специально для физического хоста .Если ваша служба HTTP также работает в контейнере, вам нужно знать какой-нибудь путь host-system , который вы можете записать, который также виден в вашей файловой системе контейнера.

  2. Runningлюбая команда docker вообще требует прав суперпользователя.Если какое-либо из имен файлов или путей является динамическим, атаки с использованием оболочки могут поставить под угрозу вашу систему .Будьте очень осторожны при запуске этого сценария из сетевого сценария.

0 голосов
/ 18 декабря 2018

Один из способов сделать это - загрузить файлы в каталог, к которому у контейнера Docker есть доступ, а затем опросить каталог на наличие новых файлов с помощью скрипта Python.Вы можете получить доступ к локальным каталогам из контейнеров Docker, используя "bind mounts" .Google, например, «Как обмениваться данными между Docker-контейнером и хост-системой», чтобы узнать больше о том, как подключать монтирование и делиться томами.

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