だから、私はdocker-composeを介してDjango、postgress、nginxコンテナをデプロイしていますが、私には理解できない問題があります。
私のDjangoアプリで次のエラーを解決するために、Django=移行を実行する必要がありました。
docker@postgres ERROR: relation "accounts_myprofile" does not exist
移行を実行しようとして、私は試しました:
docker-compose run web python manage.py makemigrations
docker-compose run web python manage.py migrate
次を返しました:
Migrations for 'accounts':
accounts/migrations/0001_initial.py:
- Create model Entry
- Create model MyProfile
Running migrations:
No migrations to apply.
Djangoコンテナー内からのみ正常に移行できました。例:
docker exec -i -t 6dc97c6a305c /bin/bash
python manage.py makemigrations
python manage.py migrate
この問題は解決しましたが、docker-compose runを使用して移行を実行しても実際には何も移行されない理由がわかりません。私は誰かがこれについて正しい方向に私を向けることができることを望んでいます。
また、これが関連する問題であるかどうかはわかりませんが、docker-compose run webコマンドを実行すると、手動で停止しない限りシャットダウンしない新しいコンテナーを作成しているようです、docker-compose stopそれらを削除しません。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7bb3c7106d1 accounts_web "python manage.py che" 4 hours ago Restarting (0) 41 minutes ago 8000/tcp accounts_web_run_62
ee19ca6cdf49 accounts_web "python manage.py mig" 4 hours ago Restarting (0) 43 minutes ago 8000/tcp accounts_web_run_60
2d87ee35de3a accounts_web "python manage.py mak" 4 hours ago Restarting (0) 43 minutes ago 8000/tcp accounts_web_run_59
1c6143c13097 accounts_web "python manage.py mig" 4 hours ago Restarting (1) 44 minutes ago 8000/tcp accounts_web_run_58
6dc97c6a305c b1cb7debb103 "python manage.py run" 3 days ago Up 4 hours 8000/tcp accounts_web_1
注:Docker-compose stopは、コンテナーを(必要に応じて)正しく停止しますが、docker-compose run web python manage.py migrate手動で停止します。
私のdocker-compose
web:
restart: always
build: ./web
expose:
- "8000"
links:
- postgres:postgres
volumes:
- /usr/src/app
- /usr/src/app/static
env_file: .env
environment:
DEBUG: 'true'
command: python manage.py runserver 0.0.0.0:8000
postgres:
restart: always
image: kartoza/postgis:9.4-2.1
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data/
あなたはすでに問題に気づいています。 docker-compose run
を使用すると、新しいコンテナが作成されます。
最初のコマンド(makemigrations)を実行すると、新しいコンテナーが作成され、makemigrationsが実行され、移行ファイルが(新しい)コンテナーのファイルシステムに書き込まれました。
2番目のコマンド(移行)を実行すると、別の新しいコンテナーが作成されました。移行は実行されましたが、何の関係もありませんでした。これは、移行ファイルが利用できなかったためです-それらは、この新しいファイルとは異なるコンテナに書き込まれました。
これはいくつかの方法で解決できます。
最初に、すでに行ったことを行うことができますが、run
の代わりにdocker-compose exec
を使用します。
docker-compose exec web python manage.py makemigrations
docker-compose exec web python manage.py migrate
exec
は、新しいコンテナを作成するのではなく、すでに実行されているコンテナを使用します。
別のオプションは、エントリーポイントスクリプトを使用して、サーバーを起動する前にそこで移行を実行することです。これは、より自動化することを好む場合の方法です。
Dockerfile:
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
entrypoint.sh:
#!/bin/sh
python manage.py makemigrations
python manage.py migrate
exec "$@"
docker-compose.yml(「web」の下):
entrypoint: /entrypoint.sh
このシナリオでは、コンテナが起動すると、エントリポイントスクリプトが実行され、移行が処理され、command
(この場合はDjango runserver
)。
お気づきのように、新しいコンテナは実行されたままです。これは通常、予期しないものです。コマンドを、実行を続けるのではなく、終了すべきコマンドでオーバーライドしたからです。ただし、docker-compose.ymlでは、restart: always
を指定しました。そのため、移行コマンドを繰り返し実行し、コマンドが終了するたびに再起動します。
ダンロウは非常にいい答えをしましたが、エントリポイントスクリプトは機能しませんでした。問題は、たとえば「yes」/「no」など、一部の「makemigrations」が入力を期待することです。
ダンロウの答えを補完することができます:
python manage.py makemigrations --noinput
の代わりに
python manage.py makemigrations
(これは、少なくとも単純な「はい」/「いいえ」の質問に対しては機能します)