Предположим следующую настройку:
Я хочу взять эти загруженные данные и передать их скрипту python.
Я не могу найти ничего, что объясняло бы, как передавать динамически сгенерированные входные данные в контейнер.
Можно ли это сделать, выполнив сценарий оболочки из приложения laravel, которое содержит загруженный файл в качестве переменной, указанной в ENTRYPOINT файла docker?
Есть ли другие способы сделать это?
Один из способов сделать это - загрузить файлы в каталог, к которому у контейнера Docker есть доступ, а затем опросить этот каталог на наличие новых файлов с помощью скрипта Python. Вы можете получить доступ к локальным каталогам из контейнеров Docker с помощью "привязать крепления". Погуглите что-нибудь вроде «Как обмениваться данными между контейнером Docker и хост-системой», чтобы узнать больше о привязке, монтировании и совместном использовании томов.
Я настоятельно рекомендую использовать для таких целей tcp / ip. Кстати, в этом случае вам принесут пользу:
Реализация действительно проста. Вы можете выбрать любой фреймворк, но мне подходит 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.
... 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
находятся в пространстве частной файловой системы контейнера.
Есть два больших предостережения:
Пути хостов в опции docker run -v
- это пути конкретно на физическом хосте. Если ваша HTTP-служба также работает в контейнере, вам необходимо знать некоторый путь хост-система, который вы можете записать, который также виден в файловой системе вашего контейнера.
Для эффективного выполнения любой команды docker
требуются привилегии суперпользователя. Если какие-либо имена файлов или пути являются динамическими, атаки путем инъекции оболочки могут поставить под угрозу вашу систему. Будьте очень осторожны с тем, как вы запускаете это из доступного по сети сценария.
Спасибо, Дэвид. Прочитав ваш ответ и оценив то, что мне нужно сделать, я думаю, вы правы, сказав «просто запустите». Мне нужно, чтобы функция управлялась событиями (например, когда пользователь загружает файл, выполняет некоторую обработку), поэтому я думаю, что лучший способ сделать это - запустить его в AWS Lambda, а не в Docker, и передать ему HTTP-запросы.
Спасибо за ваш ответ, Делена - я не тестировал это, но благодарен за ваш вклад. Я просто собираюсь избегать использования Docker для клиента и вместо этого запускать скрипт python в AWS Lambda / Cloud Functions.