Docker-Compose를 사용할 때 Django 데이터베이스 마이그레이션을 어떻게 수행합니까?
Docker 사이트 의 Django Quick Start 지침에 따라 Docker Django / PostgreSQL 앱을 설정했습니다 .
Django의 manage.py migrate 명령을 처음 실행 sudo docker-compose run web python manage.py migrate
하면 예상대로 작동합니다. 데이터베이스는 Docker PostgreSQL 컨테이너 내부에 구축됩니다.
Django 앱 자체에 대한 변경 사항은 저장하는 순간 Docker Django 컨테이너에 마찬가지로 반영됩니다. 훌륭합니다!
그러나 Django에서 모델을 변경하고 모델과 일치하도록 Postgres 데이터베이스를 업데이트하려고하면 변경 사항이 감지되지 않으므로 몇 번 makemigrations
이나 migrate
다시 실행하더라도 마이그레이션이 발생하지 않습니다 .
기본적으로 Django 모델을 변경할 때마다 Docker 컨테이너를 삭제하고 (를 사용하여 sudo docker-compose rm
) 새 마이그레이션으로 새로 시작해야합니다.
나는 여전히 Docker에 대해 머리를 돌리려고 노력하고 있으며 작동 방식에 대해 이해하지 못하는 끔찍한 것이 있지만 이것은 나를 미치게합니다. 마이그레이션에 변경 사항이 표시되지 않는 이유는 무엇입니까? 내가 도대체 뭘 잘못하고있는 겁니까?
실행중인 도커 컨테이너에 로그인하고 명령을 실행하기 만하면됩니다.
- 스택 구축 :
docker-compose build -f path/to/docker-compose.yml
- 스택 시작 :
docker-compose up -f path/to/docker-compose.yml
- 컨테이너를 실행하는 도커 표시 :
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3fcc49196a84 ex_nginx "nginx -g 'daemon off" 3 days ago Up 32 seconds 0.0.0.0:80->80/tcp, 443/tcp ex_nginx_1
66175bfd6ae6 ex_webapp "/docker-entrypoint.s" 3 days ago Up 32 seconds 0.0.0.0:32768->8000/tcp ex_webapp_1
# postgres docker container ...
- django 앱 의 CONTAINER ID 를 얻고 로그인하십시오.
docker exec -t -i 66175bfd6ae6 bash
이제 로그인 한 다음 오른쪽 폴더로 이동하십시오.
cd path/to/django_app
그리고 지금, 당신은 당신의 모델을 편집 할 때마다, 컨테이너에서 실행
python manage.py makemigrations
하고python manage.py migrate
또한 django docker 컨테이너 파일이 자동으로 실행되도록 docker-entrypoint를 사용하는 것이 좋습니다.
- 대충
- 마이그레이션
- runserver 또는 gunicorn 또는 uWSGI로 시작
다음은 예입니다 ( docker-entrypoint.sh
).
#!/bin/bash
# Collect static files
echo "Collect static files"
python manage.py collectstatic --noinput
# Apply database migrations
echo "Apply database migrations"
python manage.py migrate
# Start server
echo "Starting server"
python manage.py runserver 0.0.0.0:8000
이 방법을 사용합니다.
services:
web:
build: .
image: uzman
command: python manage.py runserver 0.0.0.0:8000
ports:
- "3000:3000"
- "8000:8000"
volumes:
- .:/code
depends_on:
- migration
- db
migration:
image: uzman
command: python manage.py migrate --noinput
volumes:
- .:/code
depends_on:
- db
docker
우리가 만든 계층 구조를 사용 하여 서비스 마이그레이션은 데이터베이스를 설정 한 후 메인 서비스를 실행하기 전에 실행됩니다. 이제 서비스 docker
를 실행하면 서버가 실행되기 전에 마이그레이션이 실행됩니다. 그보고 migration
서버가 웹 서버가이 문제를 방지, 모든 마이그레이션 프로젝트에서 수행된다는 것을 의미하는 것과 같은 이미지 위에 적용된다.
이 방법으로 진입 점을 만들거나 다른 것을 피할 수 있습니다.
스택을 실행 한 다음 원샷 docker-compose run 명령을 실행하십시오. 예
#assume django in container named web
docker-compose run web python3 manage.py migrate
https://docs.docker.com/compose/reference/run/
You can use docker exec
command
docker exec -it container_id python manage.py migrate
I know this is old, and maybe I am missing something here (if so, please enlighten me!), but why not just add the commands to your start.sh
script, run by Docker to fire up your instance? It will take only a few extra seconds.
N.B. I set the DJANGO_SETTINGS_MODULE
variable to make sure the correct database is used, as I use different databases for development and production (although I know this is not 'best practice').
This solved it for me:
#!/bin/bash
# Migrate the database first
echo "Migrating the database before starting the server"
export DJANGO_SETTINGS_MODULE="edatool.settings.production"
python manage.py makemigrations
python manage.py migrate
# Start Gunicorn processes
echo "Starting Gunicorn."
exec gunicorn edatool.wsgi:application \
--bind 0.0.0.0:8000 \
--workers 3
'Nice programing' 카테고리의 다른 글
Yeoman 발전기를 업데이트하는 데 선호되는 방법은 무엇입니까? (0) | 2020.11.04 |
---|---|
C ++ 및 OpenGL 행렬 순서 간의 혼동 (행 주요 대 열 주요) (0) | 2020.11.04 |
다변량 하스켈 함수를 만드는 방법은 무엇입니까? (0) | 2020.11.04 |
#pragma 경고 푸시 / 팝을 사용하여 일시적으로 경고 수준을 변경하는 것이 올바른 방법입니까? (0) | 2020.11.04 |
JSONResult를 문자열로 (0) | 2020.11.04 |