Обычно большая часть связи между контейнерами Docker осуществляется через сетевые сокеты.Это нормально, когда вы говорите с чем-то вроде реляционной базы данных или HTTP-сервером.Похоже, что ваше приложение немного больше относится к совместному использованию файлов, и в этом Docker немного менее хорош.
Если вам нужна только одна копия каждого компонента или вы все еще активно разрабатываетеконвейер: Я бы, вероятно, не использовал Docker для этого.Поскольку каждый контейнер имеет изолированную файловую систему и свое собственное пространство идентификаторов пользователей, общий доступ к файлам может быть неожиданно сложным (каждый контейнер должен согласовывать числовые идентификаторы пользователей).Но если вы просто запускаете все на хосте, как один и тот же пользователь, указывая на один и тот же каталог, это не проблема.
Если вы пытаетесь масштабировать это в рабочей среде: Я бы добавил какую-то общую файловую систему и систему очередей сообщений, такую как RabbitMQ.Для локальной работы это может быть Docker с именем том или смонтированный на привязке хост-каталог;облачное хранилище вроде Amazon S3 тоже будет работать нормально.Настройка выглядит следующим образом:
- Каждый компонент знает об общем хранилище и подключается к RabbitMQ, но не знает о других компонентах.
- Каждый компонент читает сообщение из очереди RabbitMQимя файла для обработки.
- Компонент читает файл и выполняет свою работу.
- По завершении компонент записывает файл результатов обратно в общее хранилище и записывает свое местоположение вобмен RabbitMQ.
В этой настройке каждый компонент не имеет состояния.Если вы обнаружите, что, например, компонент машинного обучения медленнее, вы можете запустить его дубликаты.Если что-то сломается, RabbitMQ запомнит, что данное сообщение не было полностью обработано (подтверждено);и снова из-за изолированности вы можете запустить этот конкретный компонент локально, чтобы воспроизвести и исправить проблему.
Эта модель также хорошо подходит для более крупных систем кластерных вычислений на основе Docker, таких как Kubernetes.
Выполняя это локально, я бы совершенно отдельно держал отдельные задачи в отдельных контейнерах (особенно, если индивидуальная обработка изображений и задачи ML стоят дорого).Для установки, которую я предлагаю, нужна как очередь сообщений (для отслеживания работы), так и общая файловая система (поскольку очереди сообщений обычно не оптимизированы для отдельных сообщений размером более 10 МБ).Вы можете выбрать между именованными томами Docker и хост-связыванием хоста как легкодоступное общее хранилище.Связывание монтируется легче для проверки и администрирования, но на некоторых платформах легендарно медленно.Именованные тома, я думаю, достаточно быстрые, но вы можете получить к ним доступ только из контейнеров Docker, что означает необходимость запуска большего количества контейнеров для выполнения базовых задач, таких как резервное копирование и сокращение.