Docker-Compose를 사용할 때 Django 데이터베이스 마이그레이션을 어떻게 수행합니까?
Docker Django/Postgre를 설정했습니다.도커 사이트의 장고 퀵 스타트 지침을 바짝 따라가는 SQL 앱.
처음으로 장고의 맡았을 때 매니저를명령py 명령을 사용하여 migrate, 사용 사용 명령sudo docker-compose run web python manage.py migrate
, 대로 대로. Postgre [ Docker Postgre ]에 [ Docker Postgre ]됩니다 [ ] 됩니다.SQL 컨테이너도 괜찮습니다.
장고 앱 자체의 변경 사항도 저장하는 순간 도커 장고 컨테이너에 반영됩니다.대단해요!
을 하고 과 하도록 를 하려고 이 되지 하지 해도 이 에서 를 하지 이 해도 에서 을 하도록 makemigrations
아니면migrate
한 번, 다시.
모델을 ① Django ② Docker ③ Docker ④ 를 사용합니다).sudo docker-compose rm
및새 시작합니다 및 새 마이그레이션을 시작합니다.
전 아직도 도커에 대해 생각해보려고 노력하고 있어요 그리고 그게 어떻게 작동하는지 이해가 안가는게 정말 많지만, 이건 정말 미칠것 같아요마이그레이션하면 변경 사항이 표시되지 않는 이유는 무엇입니까?내가 뭘 잘못하고 있는 거지?
실행 중인 도커 컨테이너에 로그인하고 명령을 실행하기만 하면 됩니다.
- : 을 합니다 합니다.
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 ...
- yud jango app의 CONTAINER ID를 가져와 다음에 로그인합니다.
docker exec -t -i 66175bfd6ae6 bash
한 후 폴더로 합니다: 한 로 합니다 합니다 로 한 .
cd path/to/django_app
을 할 마다 합니다 에서 합니다 에서 마다 을 할
python manage.py makemigrations
그리고.python manage.py migrate
또한 django docker 컨테이너 파일을 자동으로 실행하려면 django docker-entrypoint를 사용하는 것을 권장합니다.
- 정전의
- 이주하다
- 서버를 실행하거나 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
합니다.기에을다를et을l에를기knr;gmigration
서버는 웹 서버와 동일한 이미지를 통해 적용되므로 모든 마이그레이션이 프로젝트에서 수행되어 문제가 발생하지 않습니다.
당신은 이런 식으로 진입 지점이나 다른 것을 만드는 것을 피합니다.
스택을 실행한 다음 원샷 도커 컴포지트 실행 명령을 발사합니다.예
#assume django in container named web
docker-compose run web python3 manage.py migrate
이 기능은 기본 제공 SQLite 데이터베이스뿐만 아니라 종속성으로 나열된 외부 도커화된 데이터베이스에도 유용합니다.여기 예시적인 도커 작곡이 있습니다.yaml
version: '3'
services:
db:
image: postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
https://docs.docker.com/compose/reference/run/
사용가능docker exec
지휘권을
docker exec -it container_id python manage.py migrate
사용가능docker-entrypoint.sh
아니면 더 새로운 해결책은 당신의 여러 의견일 것입니다.docker-compose.yml
version: '3.7'
services:
web:
build: ./
command: >
sh -c "python manage.py collectstatic --noinput &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
volumes:
- ./:/usr/src/app/
ports:
- 8000:8000
env_file:
- ./.env
depends_on:
- postgres
postgres:
image: postgres:13.0-alpine
ports:
- 5432:5432
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
이런 것이 당신의 안에 있다면,docker-compose.yml
version: "3.7"
services:
app:
build:
context: .
dockerfile: docker/app/Dockerfile
ports:
- 8000:8000
volumes:
- ./:/usr/src/app
depends_on:
- db
db:
image: postgres
restart: always
environment:
POSTGRES_USER: docker
POSTGRES_PASSWORD: docker
POSTGRES_DB: docker
그럼 간단하게...
~$ docker-compose exec app python manage.py makemigrations
~$ docker-compose exec app python manage.py migrate
도커 Exec을 사용하면 다음 오류가 발생했습니다.
AppRegistryNotReady("Models aren't loaded yet.")
그래서 대신 이 명령을 사용했습니다.
docker-compose -f local.yml run django python manage.py makemigrations
이것이 오래된 것이라는 것을 알고 있고, 아마도 여기서 무언가를 놓치고 있는 것 같습니다(만약 그렇다면, 제발 저를 깨우쳐 주세요!). 하지만 명령을 그냥 당신의 명령에 추가하는 것이 어떨까요?start.sh
도커가 당신의 인스턴스를 작동시키기 위해 실행하는 스크립트?몇 초만 더 소요됩니다.
N.B. 내가 설정한 것은DJANGO_SETTINGS_MODULE
개발 및 생산을 위해 서로 다른 데이터베이스를 사용하기 때문에 올바른 데이터베이스가 사용되는지 확인하기 위한 변수입니다(비록 이것이 '최상의 관행'이 아니라는 것을 알고 있습니다).
이것으로 해결할 수 있었습니다.
#!/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
도커 파일만 사용하려는 경우 ENTERN POINT[] 명령을 추가할 수 있습니다..sh 스크립트 실행 방법 예:
FROM python:3.9.4
RUN apt-get update
RUN apt-get install libpq-dev --assume-yes
RUN pip3 install psycopg2
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
RUN pip3 install debugpy
ENTRYPOINT ["/app/docker-entrypoint.sh"]
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
언급URL : https://stackoverflow.com/questions/33992867/how-do-you-perform-django-database-migrations-when-using-docker-compose
'programing' 카테고리의 다른 글
Oracle의 여러 조건에 대한 사례 설명 (0) | 2023.09.09 |
---|---|
컨테이너 오버라이드 프로세서의 MariaDB가 60%로 증가 (0) | 2023.09.09 |
도커 레지스트리 v2에서 이미지 목록을 가져오는 방법 (0) | 2023.09.04 |
기본 방법 대신 인증 쿠키를 수동으로 만들려면 어떻게 해야 합니까? (0) | 2023.09.04 |
장고 형태의 CSS 스타일링 (0) | 2023.09.04 |