1. ホーム
  2. django

[解決済み] Docker-Compose使用時にDjangoデータベースのマイグレーションをどのように行うか?

2022-04-28 01:44:06

質問内容

私は、Docker Django/PostgreSQLアプリを、以下のように綿密にセットアップしました。 Docker サイトの Django Quick Start の手順 .

初めて 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について理解しようとしていて、その仕組みについて理解できないことが非常に多いのですが、この件に関しては気が狂いそうです。なぜmigrateは私の変更を見ないのでしょうか?私は何を間違えているのでしょうか?

解決方法は?

実行中のDockerコンテナにログインして、コマンドを実行するだけです。

  1. スタックを構築する : docker-compose build -f path/to/docker-compose.yml
  2. スタックを起動する : docker-compose up -f path/to/docker-compose.yml
  3. dockerで動作中のコンテナを表示する : 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 ...

  1. を取得します。 コンテナID にログインしてください。
docker exec -t -i 66175bfd6ae6 bash

  1. これでログインできたので、右のフォルダーに移動してください。 cd path/to/django_app

  2. そして今、モデルを編集するたびに、コンテナ内で実行する: python manage.py makemigrationspython manage.py migrate

また、django の docker コンテナファイルを自動的に実行するために、 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