Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在docker中运行django迁移_Django_Docker_Docker Compose - Fatal编程技术网

在docker中运行django迁移

在docker中运行django迁移,django,docker,docker-compose,Django,Docker,Docker Compose,我正在使用docker构建Python+Django开发环境。我在docker-compose.yml中为web服务器(nginx)和数据库(postgres)容器定义了Dockerfile文件和服务,以及使用uwsgi运行我们的应用程序的容器。由于这是一个开发环境,我正在从主机系统装载应用程序代码,因此我可以在IDE中轻松编辑它 我的问题是在哪里/如何运行migrate命令 如果您不知道Django,migrate命令将创建数据库结构,然后根据项目的需要对其进行更改。我见过有人在compose

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

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

如果您不知道Django,migrate命令将创建数据库结构,然后根据项目的需要对其进行更改。我见过有人在compose命令指令
command:python manage.py migrate&&uwsgi--ini app.ini
中运行migrate,但我不希望在每次重新启动容器时都运行迁移。我只希望它在创建容器时运行一次,除非重新生成,否则不会再次运行

我在哪里/怎样做


编辑:撰写团队现在有一个未解决的问题。幸运的是,一次性命令容器将得到compose的支持

您不能使用
RUN
,因为正如您在注释中提到的,您的源代码是在容器运行期间装载的

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


我建议在运行容器后手动使用
docker exec
。我不认为有一种方法可以在
dockerfile
docker compose
中自动实现这一点,因为我上面给出了两个原因。

听起来您需要的是管理项目任务的工具。是设计用于处理这些任务的工具(免责声明:我是此工具的作者)

您可以在此处看到如何运行迁移的示例:。该示例使用rails,但基本上与django的想法相同


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

docker exec-it容器名称bash

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

现在终于通过引入的新命令解决了。使用
配置文件
可以将服务标记为仅在特定配置文件中启动:

服务:
nginx:
# ...
博士后:
# ...
uwsgi:
# ...
迁移:
配置文件:[“仅限cli”]#可自由选择配置文件名称
# ...
docker compose up#只启动应用程序服务,不进行迁移
docker编写运行迁移#按需运行迁移

为什么不在dockerfile中使用创建映像时将运行的
RUN
指令?原因有二。migrate命令在一个容器(appserver)中运行,但会影响另一个容器(posgres数据库),并且compose构建是连续的。第二个原因是,在构建过程中不会装入共享卷。我发现的一个建议是使用一个依赖于数据库的一次性容器,启动共享卷,装入其中的代码,运行命令并退出。这听起来像一个计划,但我不知道如何防止这个容器在下一次
docker compose up时再次启动。也许你是对的,手动操作是最好的选择。如果我没有得到任何其他建议,我会接受你的答案。一种独立于docker的方法是让脚本在每次容器运行时运行。运行
migrate
命令后,在脚本内部创建一个空文件,该文件指示装载位置的标志状态。下次容器启动脚本时,检查文件是否存在跳过运行
migrate
命令,否则创建它并运行您的
migrate
命令。这可能是个好主意。我曾考虑编写一个shell脚本来检查数据库中的表,但这似乎很复杂,如果我要编写复杂的脚本,我还可以编写创建容器的脚本并跳过编写。检查文件更容易,而且可以直接在compose config.interest工具中的命令指令中完成。我会调查的。不过我并没有做CI,所以我可能只会在docker exec命令中使用shell别名。我需要在应用程序容器启动之前运行它。此外,我想要一个单一的命令解决方案。