簡體   English   中英

如何在 Dockerized Django 中運行遷移?

[英]How do I run migrations in Dockerized Django?

我遵循了Docker + Django 教程,這很棒,因為我可以按照說明成功構建和運行網站。 但是,我終生無法弄清楚如何在更改模型后成功運行數據庫遷移。

以下是我采取的步驟:

  1. 克隆關聯的git repo
  2. 設置一個名為dev的虛擬機

    • 使用docker-machine create -d virtualbox dev
    • 並用eval $(docker-machine env dev)指向它
  3. 構建並啟動它:

    • docker-compose build
    • docker-compose up -d
  4. 運行初始遷移(這是我唯一一次能夠運行看起來成功的遷移)

    • docker-compose run web python manage.py migrate
  5. 通過導航到返回的 IP 地址來檢查該網站是否正常工作:

    • docker-machine ip dev
  6. 對模型進行更改。 我剛剛將它添加到web/docker_django/apps/todo/models.py文件中的Item模型中:

    • name = models.CharField(default='Unnamed', max_length=50, null=False)
  7. 使用以下命令更新映像並重新啟動容器:

    • docker-compose down --volumes
    • 然后docker-compose build
    • 然后docker-compose up --force-recreate -d

第 1 次遷移嘗試:

我用了:

docker-compose run web python manage.py makemigrations todo

然后:

docker-compose run web python manage.py migrate

makemigrations命令之后,它說:

Migrations for 'todo':
  0001_initial.py:
    - Create model Item

當我運行migrate命令時,它給出了以下消息:

Operations to perform: 
  Synchronize unmigrated apps: messages, todo, staticfiles 
  Apply all migrations: contenttypes, admin, auth, sessions 
Synchronizing apps without migrations: 
  Creating tables... 
    Running deferred SQL... 
  Installing custom SQL... 
Running migrations: 
  No migrations to apply. 

所以那沒有用。

第 2 次遷移嘗試:

這次我嘗試直接從正在運行的 Web 容器內部運行遷移。 這看起來像這樣:

(macbook)$ docker exec -it dockerizingdjango_web_1 bash
root@38f9381f179b:/usr/src/app# ls
Dockerfile  docker_django  manage.py  requirements.txt  static  tests
root@38f9381f179b:/usr/src/app# python manage.py makemigrations todo
Migrations for 'todo':
  0001_initial.py:
    - Create model Item
root@38f9381f179b:/usr/src/app# python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: contenttypes, todo, admin, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying todo.0001_initial...Traceback (most recent call last):
  File "/usr/local/lib/python3.5/site-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
psycopg2.ProgrammingError: relation "todo_item" already exists

此外,我在該容器中找不到任何migrations文件夾。

我顯然不知道這里發生了什么,所以如果有人能告訴我如何成功更改模型和運行數據庫遷移,我將不勝感激。 如果你能幫助我概念化當我運行這些必須讓 web 和 postgres 圖像協同工作的命令時發生了什么,那么加分。

編輯:什么對我有用

@MazelTov 的建議都將有助於自動化流程,因為我越來越習慣使用 Docker 進行開發,但是我缺少的東西,@MazelTov 在一個非常有用的討論中讓我補充,正在安裝,以便遷移出現在我的本地機器。

所以基本上,如果不是,例如,我的遷移嘗試 1會工作得很好:

docker-compose run web python manage.py makemigrations todo

...我用了:

docker-compose run --service-ports -v $(pwd)/web:/usr/src/app web python manage.py makemigrations todo

有很多方法可以實現這一點。

1) 在 bash 腳本中啟動應用程序(uwsgi、runserver...)之前運行 ./manage.py migrate

文件

FROM debian:latest

...

# entrypoint, must be executable file chmod +x entrypoint.sh
COPY entrypoint.sh /home/docker/entrypoint.sh

# what happens when I start the container
CMD ["/home/docker/entrypoint.sh"]

入口點.sh

#!/bin/bash

./manage.py collectstatic --noinput
# i commit my migration files to git so i dont need to run it on server
# ./manage.py makemigrations app_name
./manage.py migrate

# here it start nginx and the uwsgi
supervisord -c /etc/supervisor/supervisord.conf -n

2)如果你有很多遷移文件並且你不想停機,你可以從單獨的 docker-compose 服務運行 migrate 命令

docker-compose.yml

version: '3.3'

services:  

  # starts the supervisor (uwsgi + nginx)
  web:
    build: .
    ports: ["80:80"]

  # this service will use same image, and once the migration is done it will be stopped
  web_migrations:
    build: .
    command: ./manage.py migrate

我通過這樣做解決了這個問題:

docker-compose exec web /usr/local/bin/python manage.py makemigrations todo

進而 :

docker-compose exec web /usr/local/bin/python manage.py migrate 

我從這個問題中得到了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM