Надо написать скрипт, который будет играть роль 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.ymlversion: "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.