Запуск начальных команд в службе docker-compose

Я следовал этому руководству для запуска моего веб-приложения django локально, кроме веб-приложения единственным сервисом является postgres db.

Я написал простой скрипт entrypoint.sh для автоматизации начальных операций, необходимых для приложения django, например migrate, makemigrations, collectstatic, createsuperuser;

Все работает нормально, за исключением того, что entrypoint.sh запускается каждый раз, когда я использую docker-compose up, выполняя начальные операции, которые должны выполняться только один раз.

Как настроить Dockerfile или docker-compose.yml так, чтобы entrypoint.sh запускался только в первый раз, а не каждый раз, когда я docker-compose down и затем docker-compose up снова?

Dockerfile

# importing base image
FROM python:3.9

# updating docker host or host machine
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    && rm -rf /var/lib/apt/lists/*

# changing current working directory to /usr/src/app
WORKDIR /usr/src/app

# copying requirement.txt file to present working directory
COPY requirements.txt ./

# installing dependency in container
RUN pip install -r requirements.txt

# copying all the files to present working directory
COPY . .

# informing Docker that the container listens on the
# specified network ports at runtime i.e 8000.
EXPOSE 8000
ENTRYPOINT ["./entrypoint.sh"]

docker-compose.yml

version: '3.7'

services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  app:
    build: ./
    command: gunicorn sial.wsgi:application --workers=2 --bind 0.0.0.0:8000
    volumes:
      - ./data/:/usr/src/app/data/
      - ./media/:/usr/src/app/media/
    ports:
      - 8000:8000
      - 5432:5432
    environment:
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - DJANGO_SUPERUSER_EMAIL=admin@email.it
      - DJANGO_SUPERUSER_USERNAME=admin@email.it
      - DJANGO_SUPERUSER_PASSWORD=passadmin
    depends_on:
      - db

entrypoint.sh

#!/bin/bash

python3 manage.py migrate;

python3 manage.py makemigrations;

python3 manage.py migrate;

python3 manage.py collectstatic --clear;

python3 manage.py createsuperuser --no-input;

gunicorn sial.wsgi:application --workers=2 --bind 0.0.0.0:8000;

RECAP

В директории, где находятся мой Dockerfile и файл docker-compose.yml:

  1. sudo docker-compose build app
  2. sudo docker-compose up -> применяются начальные миграции, собираются статические файлы, создается суперпользователь
  3. sudo docker-compose down
  4. sudo docker-compose up -> применяются начальные миграции, собираются статические файлы, суперпользователь создан ВНОВЬ. Я пытаюсь избежать этого.
  5. .

Я новичок в docker-compose и любая помощь будет очень признательна, спасибо.

Грязным, но простым способом было бы игнорировать ошибку команды createsuperuser, изменив ее на python3 manage.py createsuperuser --no-input || true;.

Возможно, это даже то решение, которое вы предпочитаете, потому что если переменные для docker-compose изменятся, будет создан новый суперпользователь с измененными значениями.

#!/bin/bash

python3 manage.py migrate;

python3 manage.py makemigrations;

python3 manage.py migrate;

python3 manage.py collectstatic --clear;

python3 manage.py createsuperuser --no-input || true;

gunicorn sial.wsgi:application --workers=2 --bind 0.0.0.0:8000;
Вернуться на верх