Нет ничего плохого в том, как вы сейчас настроили инструмент, без Docker, и я бы продолжал делать то, что вы делаете, если вы не пытаетесь решить какую-то конкретную проблему с ним.
Когда вы записываете описание проблемы как «просмотр файловой системы», «экспорт в файлы», «запуск файла jar», это не та архитектура, которая хорошо работает в Docker.Общий доступ к файлам между контейнерами сложен (требуются параметры времени запуска, существуют скрытые проблемы с разрешениями), один контейнер не может напрямую запустить команду в другом, и один контейнер не может запустить другой контейнер без доверия с неограниченным доступом на уровне rootпо всей системе.
Перестройка этого в форму, которая будет хорошо работать с Docker, потребует некоторого реинжиниринга, который является своего рода вторичным по отношению к реальной проблеме, которую вы пытаетесь решить.Два типичных подхода:
Вместо того, чтобы инструмент Java был инструментом, который запускается один раз и завершается, сделайте его длительным процессом с интерфейсом HTTP.Интерфейс Django будет HTTP POST файл, который он хочет обработать, и получит результаты обратно в ответ HTTP.
Развернуть очередь заданий, как RabbitMQ.Когда в приложении Django есть файл, который он хочет обработать, он отправляет его в очередь заданий.Оберните Java-инструмент в работника, который читает из очереди запросов, выполняет ее обработку и пишет в очередь ответов.Затем приложение Django может получить ответ.
Последний вариант «наиболее промышленный» - если вам нужно обрабатывать тысячи файлов одновременно, увеличивайте и уменьшайтеколичество Java-работников, которые у вас были в зависимости от рабочей нагрузки, и, как правило, запускают это как производственную сетевую службу, это хороший путь.Это не похоже на масштаб, к которому вы стремитесь.
Наконец: вы должны никогда eval()
ничего, и вы должны особенно никогда eval()
что-то, что вы получаете из HTTP-запроса.Это огромная катастрофа безопасности, ожидающая, чтобы случиться.(Любой, кто сможет обратиться к вашему сервису, сможет прочитать или записать любой файл, который может сделать ваш сервис, и, возможно, даже изменить код, запущенный сервисом; это может очень легко стать сценарием, когда кто-то захватит всю вашу систему.)