web-dev-qa-db-ja.com

「docker-compose run web」コマンドでDjango移行を実行できないのはなぜですか?

だから、私は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/
12
david

docker-composeの実行により新しいコンテナが作成されます

あなたはすでに問題に気づいています。 docker-compose runを使用すると、新しいコンテナが作成されます。

最初のコマンド(makemigrations)を実行すると、新しいコンテナーが作成され、makemigrationsが実行され、移行ファイルが(新しい)コンテナーのファイルシステムに書き込まれました。

2番目のコマンド(移行)を実行すると、別の新しいコンテナーが作成されました。移行は実行されましたが、何の関係もありませんでした。これは、移行ファイルが利用できなかったためです-それらは、この新しいファイルとは異なるコンテナに書き込まれました。

これはいくつかの方法で解決できます。

Docker-compose execを使用する

最初に、すでに行ったことを行うことができますが、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を指定しました。そのため、移行コマンドを繰り返し実行し、コマンドが終了するたびに再起動します。

32
Dan Lowe

ダンロウは非常にいい答えをしましたが、エントリポイントスクリプトは機能しませんでした。問題は、たとえば「yes」/「no」など、一部の「makemigrations」が入力を期待することです。

ダンロウの答えを補完することができます:

python manage.py makemigrations --noinput

の代わりに

python manage.py makemigrations

(これは、少なくとも単純な「はい」/「いいえ」の質問に対しては機能します)

0
Rexcirus