@No_name451

Как использовать нескольких блокирующих команд в docker-compose?

Добрый день.

Знакомлюсь ближе с docker-compose, но возник вопрос каксаемо выполнения некольких команд для запуска проекта на django и подключения gunicorn.

В проекте используется: django, rqworker(redis), rqscheduler(redis), postgres.

На локальной машине запускаю проект при помощи 3-х териминалов (т.к. каждая из них является блокирующей):

1. терминал:
<env>user@pc: python manage.py rqworker
2. терминал:
<env>user@pc: python manage.py rqscheduler
3. терминал:
<env>user@pc: python manage.py runserver

Вопрос 1:
Как правильно должен выглядеть docker-compose для запуска этих 3-х команд (если знаете как подключенить redis и postgres, прошу и с этим помочь)?

Вопрос 2:
Есть желание подключить gunicorn, но как это сделать?


Буду весьма благодарен, если подскажите.
  • Вопрос задан
  • 567 просмотров
Решения вопроса 1
karabanov
@karabanov Куратор тега Docker
Системный администратор
Надо написать скрипт, который будет играть роль ENTRYPOINT. Такой скрипт может обладать очень богатым функционалом, но для решения задачи хватит:
docker-entrypoint.sh
#!/bin/sh
set -e

if [ "x$DJANGO_MANAGEPY_MIGRATE" = 'xenable' ]; then
    python manage.py migrate --noinput
fi

if [ "x$DJANGO_MANAGEPY_COLLECTSTATIC" = 'xenable' ]; then
    python manage.py collectstatic --noinput
fi

if [ "x$DJANGO_MANAGEPY_LOADDATA" = 'xenable' ]; then
    python manage.py loaddata fixtures/initial_data.json
fi

if [ "x$DJANGO_MANAGEPY_PARALLELRUN" = 'xenable' ]; then
    python manage.py rqworker &
    python manage.py rqscheduler &
    python manage.py runserver &
fi

exec "$@"

Написать Dockerfile на базе которого будет запускаться контейнер и добавить в него ENTRYPOINT ["./docker-entrypoint.sh"]

Среди прочего в Dockerfile следует добавить инструкции по установке gunicorn и прочих зависимостей.

Запускать всё это можно из
docker-compose.yml
version: "3.9"
   
services:
  db:
    container_name: mysql
    image: mysql:8.0.22
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - /data:/var/lib/mysql
    restart: always
    networks:
      - net

  django:
    container_name: django
    build:
        context: .
        args:
          USER_ID: ${USER_ID}
          GROUP_ID: ${GROUP_ID}
          USER_NAME: ${USER_NAME}
          GROUP_NAME: ${GROUP_NAME}
          DOMAIN_NAME: ${DOMAIN_NAME}
          RUN_DEPS: ${RUN_DEPS}
          BUILD_DEPS: ${BUILD_DEPS} 
    environment:
      DJANGO_MANAGEPY_MIGRATE: ${DJANGO_MANAGEPY_MIGRATE}
      DJANGO_MANAGEPY_COLLECTSTATIC: ${DJANGO_MANAGEPY_COLLECTSTATIC}
      DJANGO_MANAGEPY_COLLECTSTATIC: ${DJANGO_MANAGEPY_COLLECTSTATIC}
      DJANGO_MANAGEPY_LOADDATA: ${DJANGO_MANAGEPY_LOADDATA}
      DJANGO_MANAGEPY_PARALLELRUN: ${DJANGO_MANAGEPY_PARALLELRUN}
    command: gunicorn ${WSGI}.wsgi:application --user ${USER_NAME} --group ${GROUP_NAME} --name ${APP_NAME} --workers ${WORKERS} --max-requests ${MAX_REQ} --timeout ${TIMEOUT} --preload --bind=unix:/var/www/${USER_NAME}/data/tmp/${APP_NAME}.sock
    volumes:
      - /blabla:/blabla
    depends_on:
      - db
    restart: always
    networks:
      - net

networks:
  net:
    name: net

В command вписать команду запуска gunicorn, сначала отработает скрипт docker-entrypoint.sh, затем запуститься gunicorn.

Прочие сервисы добавляются в docker-compose.yml аналогично тому, как я описал добавление MySQL.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@q2digger
никого не трогаю, починяю примус
docker-compose не знапускает команды
он инструмент запуска докер-контейнеров.
ваша задача - научится упаковывать свои приложения в контейнер (в данном случае три разных контейнера) , а после уже написать сценарий запуска этих трех контейнеров + постгрес + редис и что там еще надо..

вот отличный мануал на офф сайте докер как заворачивать приложение на питоне в контейнер
https://docs.docker.com/language/python/build-images/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы