Как структурировать приложение Docker, которое имеет несколько точек входа супервизора? - PullRequest
0 голосов
/ 18 июня 2019

Я пишу веб-приложение на 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 сценарии.

Однако мне интересно, есть ли лучший образец для чего-то подобного. Это кажется "хакерским", но я не смог найти хороших примеров, похожих на мою архитектуру. Мои проблемы / проблемы:

  1. Повторяющийся код в скриптах start_service.sh.
  2. Dockerfile не имеет точки входа или команды по умолчанию.
  3. Если один сервис становится очень большим, он раздувает контейнеры других сервисов.
...