为什么我无法通过“ docker-compose run web”命令运行django迁移?
当您运行第一个命令(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.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。因此,他们将一遍又一遍地运行迁移命令,并在每次退出时重新启动。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。