Я пытаюсь запустить оба фляжных приложения с сельдереем и пушечным огнем в одном и том же контейнере докеров. Я использую супервизора для этого. Гуникорн выполнен из 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
@David Maze Я работаю в отдельных контейнерах. Но созданный образ будет иметь размер 2 ГБ каждый. Поэтому я подумал о том, чтобы использовать сельдерей и гуникорн в одном контейнере. Пробовал и с супервайзером. Но nginx выдает ошибку
Поскольку у них одинаковые image:
, дополнительные контейнеры на самом деле не будут занимать дополнительное место; все они используют одно и то же базовое физическое хранилище для одного образа. (Или, если у них одинаковые build:
, из-за кэширования слоя Docker они создадут один и тот же образ с одним и тем же идентификатором изображения.)
Значит, если я соберу два контейнера из одного образа, каждый из них не займет 2 ГБ, а будет использоваться только один 2 ГБ? Это правильно. Но когда я проверяю docker image ls
, он показывает два изображения по 2 ГБ каждое. Это сбивает меня с толку.
Этот вывод включает общие слои, и df
будет иметь более правильный вывод. Этот подход должен работать и (несмотря на более длинный docker-compose.yml
) обычно проще и управляемее, чем привлечение супервизора; вы можете задать новый вопрос, если у вас есть установка, которая явно создает несколько больших изображений.
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.
Таким образом, супервайзер поднимет и оружейную кукурузу, и сельдерей.
Обычно контейнер Docker запускает только один процесс; для такой установки вы запустите несколько контейнеров, каждый с одним и тем же
image:
(илиbuild:
), но с разнымиcommand:
. Можете ли вы запустить все части без участия супервизора?