我正在使用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
答案 0 :(得分:0)
您无法使用RUN
,因为正如您在评论中提到的那样,在运行容器期间会挂载您的来源。
您不能使用CMD
,因为每次重新启动容器时都不希望它运行。
我建议在运行容器后手动使用docker exec
。我认为有一种方法可以在dockerfile
或docker-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的情况下运行开发时通常执行的任何命令。