Запуск Flask celery и gunicorn из одного док-контейнера

Я пытаюсь запустить оба фляжных приложения с сельдереем и пушечным огнем в одном и том же контейнере докеров. Я использую супервизора для этого. Гуникорн выполнен из docker-compose.yml как

services:
  web:
    container_name: "flask"
    build: ./
    volumes:
      - ./app:/app
    ports:
      - "8000:8000"
    environment:
      - DEPLOYMENT_TYPE=production
      - FLASK_APP=app/main.py
      - FLASK_DEBUG=1
      - MONGODB_DATABASE=testdb
      - MONGODB_USERNAME=testuser
      - MONGODB_PASSWORD=testuser
      - MONGODB_HOSTNAME=mongo
    command: gunicorn app.main:app --workers 1 --name main --reload -b 0.0.0.0:8000 --preload
    depends_on:
      - redis
      - mongo
    links:
      - mongo

В supervisord.conf настроен сельдерей

[supervisord]
nodaemon=true

[program:celeryworker]
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
command=/opt/venv/bin/celery -A app.routes.celery_tasks.celery worker --loglevel=info -B -s app/celerybeat-schedule

Супервизор выполняется из dockerfile

FROM ubuntu:20.04
LABEL maintainer="nebu"
ENV GROUP_ID=1000 \
    USER_ID=1000
RUN apt-get update && apt-get -y upgrade
RUN apt-get install -y apt-transport-https ca-certificates supervisor procps cron vim python3.8-venv python3-gdbm 
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV VIRTUAL_ENV=/opt/venv
RUN python3 -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
RUN ["python", "-m", "pip", "install", "--upgrade", "pip", "wheel"]
RUN apt-get install -y  python3-wheel
COPY ./requirements.txt /app/requirements.txt
RUN ["python", "-m", "pip", "install", "--no-cache-dir", "--upgrade", "-r", "/app/requirements.txt"]
COPY ./app /app
RUN ["mkdir", "-p","/var/log/supervisor"]
COPY ./app/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
CMD ["/usr/bin/supervisord"]

Но когда я поднимаю все контейнеры, сельдерей и бит не появляются. Итак, я вошел в оболочку контейнера приложения flask и выполнил /usr/bin/supervisord, после чего рабочий celery запускается без каких-либо ошибок. Как можно совместить как gunicorn, так и celery worker-beat из одного и того же контейнера докеров.

Обновлять

когда я использовал приведенный ниже supervisord.conf, nginx не подходит. Показывает ошибку

[supervisord]
nodaemon=true

[program:celeryworker]
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
command=/opt/venv/bin/celery -A app.routes.celery_tasks.celery worker --loglevel=info -B -s app/celerybeat-schedule

[program:myproject_gunicorn]
user=root
command=gunicorn app.main:app --workers 1 --name main --reload -b 0.0.0.0:8000 --preload
autostart=true
autorestart=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

Ошибка

nginx exited with code 1
nginx            | 2022/04/09 09:41:56 [emerg] 1#1: host not found in upstream "web" in /etc/nginx/conf.d/app.conf:8
nginx            | nginx: [emerg] host not found in upstream "web" in /etc/nginx/conf.d/app.conf:8
nginx exited with code 1
nginx            | 2022/04/09 09:41:59 [emerg] 1#1: host not found in upstream "web" in /etc/nginx/conf.d/app.conf:8
nginx            | nginx: [emerg] host not found in upstream "web" in /etc/nginx/conf.d/app.conf:8

Обычно контейнер Docker запускает только один процесс; для такой установки вы запустите несколько контейнеров, каждый с одним и тем же image: (или build:), но с разными command:. Можете ли вы запустить все части без участия супервизора?

David Maze 09.04.2022 11:39

@David Maze Я работаю в отдельных контейнерах. Но созданный образ будет иметь размер 2 ГБ каждый. Поэтому я подумал о том, чтобы использовать сельдерей и гуникорн в одном контейнере. Пробовал и с супервайзером. Но nginx выдает ошибку

imhans4305 09.04.2022 11:49

Поскольку у них одинаковые image:, дополнительные контейнеры на самом деле не будут занимать дополнительное место; все они используют одно и то же базовое физическое хранилище для одного образа. (Или, если у них одинаковые build:, из-за кэширования слоя Docker они создадут один и тот же образ с одним и тем же идентификатором изображения.)

David Maze 09.04.2022 11:58

Значит, если я соберу два контейнера из одного образа, каждый из них не займет 2 ГБ, а будет использоваться только один 2 ГБ? Это правильно. Но когда я проверяю docker image ls, он показывает два изображения по 2 ГБ каждое. Это сбивает меня с толку.

imhans4305 09.04.2022 12:04

Этот вывод включает общие слои, и df будет иметь более правильный вывод. Этот подход должен работать и (несмотря на более длинный docker-compose.yml) обычно проще и управляемее, чем привлечение супервизора; вы можете задать новый вопрос, если у вас есть установка, которая явно создает несколько больших изображений.

David Maze 09.04.2022 12:09
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
5
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

CMD ["/usr/bin/supervisord"] в dockerfile и command: gunicorn app.main:app --workers 1 --name main --reload -b 0.0.0.0:8000 --preload в docker-compose.yml конфликтуют.

Фактически, command в docker-compose.yml переопределит CMD в dockerfile. Именно поэтому поднимается только гуникорн.

Мое предложение: добавьте материалы, связанные с пушками, в supervisord.conf и удалите command в docker-compose.yml.

Таким образом, супервайзер поднимет и оружейную кукурузу, и сельдерей.

Другие вопросы по теме