Передать аргумент скрипту Python, запущенному в контейнере докера

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

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

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

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

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
1 688
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Спасибо за ваш ответ, Делена - я не тестировал это, но благодарен за ваш вклад. Я просто собираюсь избегать использования Docker для клиента и вместо этого запускать скрипт python в AWS Lambda / Cloud Functions.

lawson 19.12.2018 14:08

Я настоятельно рекомендую использовать для таких целей 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)

Спасибо за ответ @grapes - я не тестировал это, но благодарен за ваш вклад. Я просто собираюсь избегать использования Docker для клиента и вместо этого запускать скрипт python в AWS Lambda / Cloud Functions.

lawson 19.12.2018 14:09
Ответ принят как подходящий

... a python script for ...

Просто запустите его; не упаковывайте его в контейнер 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-служба также работает в контейнере, вам необходимо знать некоторый путь хост-система, который вы можете записать, который также виден в файловой системе вашего контейнера.

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

Спасибо, Дэвид. Прочитав ваш ответ и оценив то, что мне нужно сделать, я думаю, вы правы, сказав «просто запустите». Мне нужно, чтобы функция управлялась событиями (например, когда пользователь загружает файл, выполняет некоторую обработку), поэтому я думаю, что лучший способ сделать это - запустить его в AWS Lambda, а не в Docker, и передать ему HTTP-запросы.

lawson 19.12.2018 14:06

Другие вопросы по теме