首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我不能通过'docker-compose run web‘命令运行django迁移?

为什么我不能通过'docker-compose run web‘命令运行django迁移?
EN

Stack Overflow用户
提问于 2017-01-03 08:48:46
回答 4查看 23.6K关注 0票数 18

所以我通过docker-compose部署了django,postgress和nginx容器,我有一个问题,我似乎无法解决。

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

代码语言:javascript
运行
复制
docker@postgres ERROR:  relation "accounts_myprofile" does not exist

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

代码语言:javascript
运行
复制
docker-compose run web python manage.py makemigrations 
docker-compose run web python manage.py migrate

它返回以下内容:

代码语言:javascript
运行
复制
Migrations for 'accounts':
  accounts/migrations/0001_initial.py:
    - Create model Entry
    - Create model MyProfile

Running migrations:
  No migrations to apply.

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

代码语言:javascript
运行
复制
docker exec -i -t 6dc97c6a305c /bin/bash
python manage.py makemigrations
python manage.py migrate

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

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

代码语言:javascript
运行
复制
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 run web python manage.py migrate创建的其他容器将需要手动停止。

我的docker-compose

代码语言:javascript
运行
复制
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/
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-03 13:18:06

docker-compose run创建新容器

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

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

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

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

使用docker-compose exec

首先,你可以做你已经做过的事情,但是使用docker-compose exec而不是run

代码语言:javascript
运行
复制
docker-compose exec web python manage.py makemigrations 
docker-compose exec web python manage.py migrate

exec将使用已经运行的容器,而不是创建新的容器。

使用入口点脚本

另一种选择是使用入口点脚本并在服务器启动之前在那里运行迁移。如果你想让事情变得更加自动化,这就是你要走的路。

Dockerfile:

代码语言:javascript
运行
复制
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

entrypoint.sh:

代码语言:javascript
运行
复制
#!/bin/sh
python manage.py makemigrations
python manage.py migrate
exec "$@"

docker-compose.yml (在‘web’下):

代码语言:javascript
运行
复制
entrypoint: /entrypoint.sh

在此场景中,当容器启动时,入口点脚本将运行,处理迁移,然后移交给command (在本例中为Django runserver)。

新的容器永远循环

正如您所注意到的,新的容器将继续运行。这通常是意想不到的,因为您用应该退出(而不是继续运行)的命令覆盖了该命令。但是,在docker-compose.yml中,您指定了restart: always。因此,它们将一遍又一遍地运行迁移命令,每次命令退出时都会重新启动。

票数 44
EN

Stack Overflow用户

发布于 2019-09-21 00:59:15

Dan Lowe给了一个非常好的回答,但是入口点脚本对我不起作用。问题是,一些"makemigrations“期望你的输入,例如"yes"/"no”。

你可以用以下语句来补充Dan Lowe的回答:

代码语言:javascript
运行
复制
python manage.py makemigrations --noinput

而不是

代码语言:javascript
运行
复制
python manage.py makemigrations

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

票数 3
EN

Stack Overflow用户

发布于 2021-02-04 02:19:31

这个awnser是对Dan Lowe和Rexcirus回答的补充。

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

Dockefile:

代码语言:javascript
运行
复制
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"]

./docker/entrypoint.sh

代码语言:javascript
运行
复制
#!/bin/sh
python manage.py makemigrations --noinput
python manage.py migrate
python manage.py runserver 0.0.0.0:8000

现在一切运行正常。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41435014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档