当前位置: 首页 > 知识库问答 >
问题:

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

郑晗日
2023-03-14

因此,我正在通过docker-comment部署django、post外层空间和nginx容器,我有一个似乎无法解决的问题。

为了解决Django应用程序中的以下错误,我知道我必须运行Django迁移。

docker@postgres ERROR:  relation "accounts_myprofile" does not exist

在尝试运行迁移时,我尝试了:

docker-compose run web python manage.py makemigrations 
docker-compose run web python manage.py migrate

返回以下内容:

Migrations for 'accounts':
  accounts/migrations/0001_initial.py:
    - Create model Entry
    - Create model MyProfile

Running migrations:
  No migrations to apply.

我只能成功地从Django容器中迁移,例如:

docker exec -i -t 6dc97c6a305c /bin/bash
python manage.py makemigrations
python manage.py migrate

虽然我已经解决了这个问题,但我仍然不明白为什么通过docker-composerun运行迁移实际上并没有迁移任何东西。我希望有人能在这方面给我指明正确的方向。

此外,我不知道这是否是一个相关的问题,但是当我运行那些docker-composerun web命令时,它们似乎正在创建新的容器,除非我手动停止它们,否则它们不会关闭,docker-comment停止不会删除它们。

CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                          PORTS                    NAMES
a7bb3c7106d1        accounts_web            "python manage.py che"   4 hours ago         Restarting (0) 41 minutes ago   8000/tcp                 accounts_web_run_62
ee19ca6cdf49        accounts_web            "python manage.py mig"   4 hours ago         Restarting (0) 43 minutes ago   8000/tcp                 accounts_web_run_60
2d87ee35de3a        accounts_web            "python manage.py mak"   4 hours ago         Restarting (0) 43 minutes ago   8000/tcp                 accounts_web_run_59
1c6143c13097        accounts_web            "python manage.py mig"   4 hours ago         Restarting (1) 44 minutes ago   8000/tcp                 accounts_web_run_58
6dc97c6a305c        b1cb7debb103              "python manage.py run"   3 days ago          Up 4 hours                      8000/tcp                 accounts_web_1

注意:Docker compose stop将正确地停止底部的容器(应该如此),但是Docker compose创建的另一个容器运行web python管理。py migrate,将需要手动停止。

我的docker-作曲

web:    
  restart: always
  build: ./web
  expose:
    - "8000"
  links:
    - postgres:postgres

  volumes:
    - /usr/src/app
    - /usr/src/app/static

  env_file: .env
  environment:
    DEBUG: 'true'
  command: python manage.py runserver 0.0.0.0:8000


postgres:
  restart: always
  image: kartoza/postgis:9.4-2.1
  ports:
    - "5432:5432"
  volumes:
    - pgdata:/var/lib/postgresql/data/

共有3个答案

须志新
2023-03-14

这个awnser是丹·劳和雷克西鲁斯反应的补充。

为了在de CodeBuild e Fargate期间工作良好,我做了一些更改:

文件:

COPY ./docker/entrypoint.sh /usr/local/bin/
COPY ./docker/entrypoint.sh /${projectName}/
# backwards compat
RUN ln -s usr/local/bin/entrypoint.sh /

ENTRYPOINT ["entrypoint.sh"]
CMD ["entrypoint.sh"]

/码头工人/入口点。嘘

#!/bin/sh
python manage.py makemigrations --noinput
python manage.py migrate
python manage.py runserver 0.0.0.0:8000

现在一切都运行正常。

蒋俊
2023-03-14

丹·洛给出了一个非常好的答案,但是入口点脚本对我不起作用。问题是,一些“做移民”期待你的输入,例如“是”/“否”。

你可以补充Dan Lowe的回答:

python manage.py makemigrations --noinput

而不是

python manage.py makemigrations

(这至少适用于简单的“是”/“否”问题)

柏高洁
2023-03-14

你已经注意到了这个问题。使用docker compose run时,将创建一个新容器。

当您运行第一个命令(makemigrations)时,将创建一个新容器,并运行makemigrations,迁移文件将写入(新)容器的文件系统。

当您运行第二个命令(migrate)时,另一个新容器被创建。迁移正在运行,但与此无关。这是因为迁移文件不可用-它们是在与此新文件不同的容器中编写的。

你可以用几种方法来解决这个问题。

首先,您可以做您已经做过的事情,但是使用docker-composeexec而不是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撰写。yml(在“web”下):

entrypoint: /entrypoint.sh

在这种情况下,当容器启动时,entrypoint脚本将运行,处理迁移,然后切换到命令(在本例中是Djangorunserver)。

正如您所注意到的,新的容器一直在运行。这通常是意外的,因为您用一个应该退出(而不是保持运行)的命令覆盖了该命令。然而,在docker compose中。yml,您指定了重新启动:始终。因此,他们会反复运行迁移命令,每次命令退出时都会重新启动。

 类似资料:
  • 问题内容: 所以我正在通过docker-compose部署django,postgress和nginx容器,但我有一个似乎无法解决的问题。 为了解决我的Django应用程序中的以下错误,我知道我只需要运行Django迁移。 为了尝试运行迁移,我尝试了以下操作: 返回以下内容: 我只能从Django容器中成功迁移,例如: 尽管我已经解决了问题,但是我仍然不明白为什么通过docker-compose

  • 本文向大家介绍通过什么命令查找执行命令?相关面试题,主要包含被问及通过什么命令查找执行命令?时的应答技巧和注意事项,需要的朋友参考一下 答案: which 只能查可执行文件 whereis 只能查二进制文件、说明文档,源文件等  

  • 一些注意事项: 1。我最初使用的TestNG jar来自java项目中的maven repo。下面的所有方法都是用maven testNG jar和新的TestNG6.9.12下载进行测试的。 2。我可以从Eclipse中运行这个文件。只有当我尝试从命令行运行时才有问题。 3。最终目标是通过javafx应用程序按钮触发命令行来运行测试。如果提供的解决方案避免在cmd中键入绝对路径,因为应用程序将在

  • 我已经用maven和testNG配置了eclipse,用我的pom配置了PF。xml如下: 我是runnong,在命令提示符下点击这个目录:D:\EclipseWorkspace\iON27Feb2013\iONAutomation\common 我的cmd控制台显示:

  • 问题内容: 我发现了几个用于通过Java类运行cmd命令的代码段,但我无法理解。 这是打开cmd的代码 我找到了一些其他链接来添加其他命令,例如cd http://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java 如何使用Java打开命令提示符并插入命令? 谁能帮助我了解如何CD目录,例如: 然后在该目录上运行其他

  • 我找到了几个通过Java类运行cmd命令的代码片段,但我无法理解。 这是打开命令的代码 我还找到了一些添加其他命令的链接,比如cdhttp://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java 如何使用Java打开命令提示符并插入命令? 有人能帮我了解如何cd目录,例如: 然后在该目录上运行其他命令?