如何构建具有多个监管入口点的Docker应用程序?

时间:2019-06-18 18:38:40

标签: docker supervisord

我正在编写一个Python Web应用程序,它包含多个服务-一个用于Web应用程序本身,一个用于队列工作程序,以及一个用于队列工作程序顶部的仪表板的服务。这些服务都包含在同一个应用程序中,但需要独立运行。

我想在单独的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

[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脚本在单独的容器中启动服务。

但是,我想知道这样的事情是否有更好的模式。感觉很“ hacky”,但我找不到任何与我的体系结构相似的好例子。我的问题/担忧是:

  1. start_service.sh脚本中的重复代码。
  2. Dockerfile没有默认入口点或命令。
  3. 如果一项服务变得非常大,它将使另一项服务的容器膨胀。

0 个答案:

没有答案