Запуск начальных команд в службе 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:
sudo docker-compose build app
sudo docker-compose up
-> применяются начальные миграции, собираются статические файлы, создается суперпользовательsudo docker-compose down
sudo docker-compose up
-> применяются начальные миграции, собираются статические файлы, суперпользователь создан ВНОВЬ. Я пытаюсь избежать этого. .
Я новичок в 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;