在docker中运行django migrate

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

我有的问题是/如何运行迁移命令。

如果你不知道Django,migrate命令将创build数据库结构,并在稍后根据项目的需要进行更改。 我已经看到人们运行迁移作为compose命令指令command: python manage.py migrate && uwsgi --ini app.ini ,但我不希望迁移到每个容器重新启动运行。 我只希望它创build容器时运行一次,除非重build,否则不会再运行。

哪里/我该怎么做?

编辑:组成团队现在有一个公开的问题。 运气好的话,一次命令容器就会被构成支持。 https://github.com/docker/compose/issues/1896

您不能使用RUN因为正如您在运行容器期间所注释的源代码中提到的那样。

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

我build议在运行容器后手动使用docker exec 。 我不认为有一种方法可以在dockerfile或者dockerfile docker-compose里面自动化,因为我上面给出了两个原因。

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

你可以在这里看到一个如何运行迁移的例子: https : //github.com/dnephin/dobi/tree/master/examples/init-db-with-rails 。 这个例子使用rails,但是和django基本上是一样的。

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

docker exec -it container-name bash

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