Лучшие практики Django: миграция и контенаризация
Я работаю над Django API и хотел бы добавить в него немного CI/CD.
Он докеризует мое приложение с
FROM python:3.12
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
ENV DJANGO_SETTINGS_MODULE=vocab_dictionnary.settings
CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]
Затем я добавляю docker-compose.yml
services:
db:
image: postgres:14
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- "POSTGRES_USER="
- "POSTGRES_PASSWORD="
- "POSTGRES_DB="
ports:
- 5438:5432
healthcheck:
test: pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-${POSTGRES_USER:-postgres}}
interval: 5s
timeout: 5s
retries: 120
start_period: 30s
web:
build: .
command: python3 /code/manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- 8000:8000
depends_on:
db:
condition: service_healthy
environment:
- "POSTGRES_HOST_AUTH_METHOD=trust"
volumes:
postgres_data:
Конец моего файла main.yml для github actions выглядит следующим образом
- name: Run Database Migrations
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
password: ${{ secrets.SERVER_PASSWORD }}
script: |
cd /${{ secrets.SERVER_USERNAME }}/api/vocab_dictionnary/
docker compose exec web python manage.py migrate
Наконец, чтобы упростить рабочий процесс локальной разработки, я добавил это в Makefile:
restart:
docker compose down
docker compose build
docker compose up -d
docker compose run web python3 manage.py makemigrations
docker compose run web python3 manage.py migrate
Моя первая проблема заключается в том, что мои миграции не применяются в локальном режиме. Я остаюсь с этим сообщением, где makemigrations вроде бы распознается, но не применяется с migrate
docker compose run web python3 manage.py makemigrations
[+] Running 1/0
⠿ Container vocab_dictionnary-db-1 Running 0.0s
Migrations for 'dictionnary':
dictionnary/migrations/0002_languages_is_valid.py
- Add field is_valid to languages
docker compose run web python3 manage.py migrate
[+] Running 1/0
⠿ Container vocab_dictionnary-db-1 Running 0.0s
Operations to perform:
Apply all migrations: admin, auth, contenttypes, dictionnary, sessions
Running migrations:
No migrations to apply.
Если я правильно понял эту страницу, я могу заменить мои действия автоматической миграцией в моем docker-compose или точкой входа в моем Dockerfile, но есть ли какая-нибудь лучшая практика? Я не могу найти ничего рекомендованного самим Django о миграциях в контексте контенаризации с помощью docker compose