我跟随了一个Docker + Django教程,非常好,按照指示成功地构建和运行了网站。但是,我无论如何都无法弄清楚如何在更改模型后成功运行数据库迁移。
这是我所采取的步骤:
- 克隆相关的 git repo。
设置一个名为
dev
的虚拟机:- 使用
docker-machine create -d virtualbox dev
- 并用
eval $(docker-machine env dev)
指向它。
- 使用
构建并启动它:
docker-compose build
- 然后
docker-compose up -d
运行初始迁移 (唯一一次我能够成功运行迁移):
docker-compose run web python manage.py migrate
通过导航到由以下命令返回的 IP 地址来检查网站是否正常工作:
docker-machine ip dev
对模型进行更改。我只是在 web/docker_django/apps/todo/models.py 文件中的
Item
模型中添加了以下内容:name = models.CharField(default='Unnamed', max_length=50, null=False)
更新镜像并重新启动容器:
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.
那个方法没起作用。
迁移尝试第二步:
这一次我尝试直接在正在运行的 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
此外,我在该容器中找不到任何“迁移”文件夹。
我显然对底层发生的事情一无所知,因此如果有人能向我展示如何成功更改模型并运行数据库迁移,我将不胜感激。如果您可以帮助我理解运行这些命令时发生了什么,以使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
WORKDIR
设置为您的项目所在的文件夹(manage.py文件),因为如果您不在Dockerfile中设置WORKDIR
,则最有可能在根目录/
下运行命令。 - Mazel Tov./manage.py migrate
只会影响数据库而不会影响 Django 项目。 - Mazel Tov