Я пишу веб-приложение на Python, которое состоит из нескольких сервисов - одного для самого веб-приложения, одного для работника очереди и одного для панели инструментов поверх работника очереди. Все эти службы содержатся в одном приложении, но должны запускаться независимо.
Я хотел бы запустить все сервисы, используя supervisord, в отдельных контейнерах Docker. В идеале у меня было бы 1 Dockerfile для всего приложения и несколько точек входа для независимого запуска различных сервисов.
Вот шаблон, с которым я работал до сих пор:
Dockerfile:
FROM python:3.7-slim
# copy app, install dependencies...
COPY supervisor/base.conf /etc/supervisor/base.conf
COPY supervisor/service_1.conf /etc/supervisor/conf.d/service_1.conf
COPY supervisor/service_2.conf /etc/supervisor/conf.d/service_2.conf
COPY supervisor/service_3.conf /etc/supervisor/conf.d/service_3.conf
COPY docker/start_service_1.sh /start_service_1.sh
COPY docker/start_service_2.sh /start_service_2.sh
COPY docker/start_service_3.sh /start_service_3.sh
start_service_1.sh:
#!/bin/bash
supervisord -c /etc/supervisor/conf.d/service_1.conf
*
service_1.conf 1013 *
[include]
files=/etc/supervisor/base.conf # Shared supervisor config for all services
[program:service_1]
command=run service_1
autostart=true
Это работает отлично для меня прямо сейчас. Я могу создать один образ Docker и запускать службы в отдельных контейнерах, используя их start_service.sh
сценарии.
Однако мне интересно, есть ли лучший образец для чего-то подобного. Это кажется "хакерским", но я не смог найти хороших примеров, похожих на мою архитектуру. Мои проблемы / проблемы:
- Повторяющийся код в скриптах
start_service.sh
.
- Dockerfile не имеет точки входа или команды по умолчанию.
- Если один сервис становится очень большим, он раздувает контейнеры других сервисов.