docker-compose运行创建新容器
您已经注意到了问题。使用时
docker-compose run,将创建一个新容器。
当您运行第一个命令(makemigrations)时,将创建一个新容器,运行makemigrations,并将迁移文件写入到(新)容器的文件系统中。
当您运行第二个命令(迁移)时,将创建另一个新容器。迁移进行了,但是没有任何关系。那是因为迁移文件不可用-它们是用不同于此新文件的容器编写的。
您可以通过两种方法解决此问题。
使用docker-compose exec
首先,您可以做已经做的事情,但是要使用
docker-compose exec代替
run。
docker-compose exec web python manage.py makemigrations docker-compose exec web python manage.py migrate
exec将使用已经在运行的容器,而不是创建新的容器。
使用入口点脚本
另一种选择是在服务器启动之前,使用入口点脚本并在其中运行迁移。如果您希望事情变得更加自动化,这就是方法。
Dockerfile:
COPY entrypoint.sh /entrypoint.shRUN chmod +x /entrypoint.sh
entrypoint.sh:
#!/bin/shpython manage.py makemigrationspython manage.py migrateexec "$@"
docker-compose.yml(在’web’下):
entrypoint: /entrypoint.sh
在这种情况下,当容器启动时,入口点脚本将运行,处理您的迁移,然后移交给
command(在本例中为Django
runserver)。
新的容器永远循环
如您所见,新容器保持运行状态。这通常是意外的,因为您用应该退出(而不是保持运行)的命令覆盖了该命令。但是,在docker-
compose.yml中,您指定了
restart: always。因此,他们将一遍又一遍地运行迁移命令,并在每次退出时重新启动。



