开发者社区> 问答> 正文

为什么我无法通过“ docker-compose run web”命令运行django迁移?

为什么我无法通过“ docker-compose run web”命令运行django迁移?

展开
收起
游客5k6m7fein3w74 2021-10-21 14:48:17 1350 0
1 条回答
写回答
取消 提交回答
  • 当您运行第一个命令(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。因此,他们将一遍又一遍地运行迁移命令,并在每次退出时重新启动。

    2021-10-21 15:01:52
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
应用 Docker 进行持续交付:用技术改变交付路程 立即下载
从Docker到容器服务 立即下载
构建基因数据应用生态系统—— docker in Bio/informatics 立即下载