Как управлять приложениями Java и Python в Docker? - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть приложение Python, основанное на Django, которое я запускаю через докер-контейнер.Приложение просматривает файловую систему и выполняет анализ некоторых файлов XML, извлекает встроенный исходный код и экспортирует его в отдельные файлы.

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

Я думал об изоляции обеих частей всей платформы.Часть Python Django находится в контейнере, файл JAR (это инструмент с открытым исходным кодом) работает в другом альпийском контейнере.

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

  • Должен ли я создать еще одну оболочку Django для файла jar, чтобы показать некоторые конечные точки, чтобы первый контейнер мог ее запустить?И, возможно, сделать обработчик обработчиком GET-запроса, который будет использовать eval() для запуска инструмента?
  • Есть ли другой способ улучшить эту архитектуру?

Редактировать: Инструмент Iиспользую: https://github.com/AbletonDevTools/groovylint

1 Ответ

0 голосов
/ 21 сентября 2019

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

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

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

  1. Вместо того, чтобы инструмент Java был инструментом, который запускается один раз и завершается, сделайте его длительным процессом с интерфейсом HTTP.Интерфейс Django будет HTTP POST файл, который он хочет обработать, и получит результаты обратно в ответ HTTP.

  2. Развернуть очередь заданий, как RabbitMQ.Когда в приложении Django есть файл, который он хочет обработать, он отправляет его в очередь заданий.Оберните Java-инструмент в работника, который читает из очереди запросов, выполняет ее обработку и пишет в очередь ответов.Затем приложение Django может получить ответ.

Последний вариант «наиболее промышленный» - если вам нужно обрабатывать тысячи файлов одновременно, увеличивайте и уменьшайтеколичество Java-работников, которые у вас были в зависимости от рабочей нагрузки, и, как правило, запускают это как производственную сетевую службу, это хороший путь.Это не похоже на масштаб, к которому вы стремитесь.

Наконец: вы должны никогда eval() ничего, и вы должны особенно никогда eval()что-то, что вы получаете из HTTP-запроса.Это огромная катастрофа безопасности, ожидающая, чтобы случиться.(Любой, кто сможет обратиться к вашему сервису, сможет прочитать или записать любой файл, который может сделать ваш сервис, и, возможно, даже изменить код, запущенный сервисом; это может очень легко стать сценарием, когда кто-то захватит всю вашу систему.)

...