在docker中运行django migrate

时间:2016-10-12 14:34:55

标签: django docker docker-compose

我正在使用docker构建Python + Django开发环境。我在docker-compose.yml中为web服务器(nginx)和数据库(postgres)容器定义了Dockerfile文件和服务,并使用uwsgi运行我们的app。由于这是一个开发环境,我正在从主机系统安装应用程序代码,因此我可以在IDE中轻松编辑它。

我遇到的问题是在哪里/如何运行migrate命令。

如果您不了解Django,则migrate命令会创建数据库结构,然后根据项目的需要对其进行更改。我已经看到人们作为compose命令指令command: python manage.py migrate && uwsgi --ini app.ini的一部分运行迁移,但我不希望迁移在每次容器重启时运行。我只希望它在我创建容器时运行一次,除非我重建,否则永远不会再运行。

我在哪里/怎么做?

编辑:组合团队现在有一个未解决的问题。运气好的话,compose支持一次性命令容器。 https://github.com/docker/compose/issues/1896

4 个答案:

答案 0 :(得分:0)

您无法使用RUN,因为正如您在评论中提到的那样,在运行容器期间会挂载您的来源。

您不能使用CMD,因为每次重新启动容器时都不希望它运行。

我建议在运行容器后手动使用docker exec。我认为有一种方法可以在dockerfiledocker-compose内自动执行此操作,因为我在上面给出了两个原因。

答案 1 :(得分:0)

听起来你需要的是一个管理项目任务的工具。 dobi是一个旨在处理这些任务的工具(免责声明:我是此工具的作者)。

您可以在此处查看如何运行迁移的示例:https://github.com/dnephin/dobi/tree/master/examples/init-db-with-rails。该示例使用rails,但它与django基本相同。

您可以设置一个名为migrate的任务,该任务将在容器中运行该命令并将数据写入卷。然后,当您启动docker-compose容器时,请使用该卷作为数据库服务的源。

答案 2 :(得分:0)

https://github.com/docker/compose/issues/1896 现在终于被 service profiles 引入的新 docker-compose 1.28.0 解决了。使用 profiles,您可以将服务标记为仅在特定配置文件中启动:

services:
  nginx:
    # ...

  postgres:
    # ...

  uwsgi:
    # ...

  migrations:
    profiles: ["cli-only"] # profile name chosen freely
    # ...
docker-compose up # start only your app services, no migrations
docker-compose run migrations # run migrations on-demand

答案 3 :(得分:-1)

>>> [[i]*n for i,n in collections.Counter(lst).most_common()] [['c', 'c', 'c', 'c'], ['a', 'a', 'a'], ['b', 'b']]

然后,您将进入容器内部,并且可以在不使用docker的情况下运行开发时通常执行的任何命令。