【问题标题】:docker-compose - database migrations and other pre/post scriptsdocker-compose - 数据库迁移和其他前/后脚本
【发布时间】:2015-07-30 04:34:37
【问题描述】:

我有一个示例 django 应用程序,我正在尝试使用 docker 启动和运行。

docker-compose up 会打开 web、db 和其他容器以及它们之间的链接。但是有一些 pre 和 post 脚本可能需要运行..

我的场景中的预脚本示例:

git
pip
docker
docker-compose
wget

后置脚本示例:

数据库迁移,通常在容器启动并运行后使用docker run web... 手动完成。

目前我在应用程序的根目录中有一个 deploy.sh,它遵循这样的逻辑..(我在启动时选择了一个 ubuntu 映像)

#assuming I always choose ubuntu base image
sudo apt-get install x
sudo apt-get install y
sudo apt-get install z
docker-compose build .; docker-compose up -d;
docker-compose run web "python manage.py makemigrations"

我的问题:

1) 运行这些命令的最佳方式是什么?

2) 每次部署时都会运行数据库迁移(从头开始?) - 还是卷解决了这个问题?

【问题讨论】:

    标签: django docker docker-compose


    【解决方案1】:

    你有两个选择:

    1. 您可以在 dockerfile 中为您的图像运行这些命令;因为每个 dockerfile 在 compose 运行时运行 - 您的图像将具有这些命令的结果。这在您进行操作系统级升级和配置引导(例如您的 apt-get 命令)时特别有用。

    2. 对于运行时级别的配置(系统启动后需要执行的操作),请在 docker-compose.yml 文件中使用 command 指令。这些将是您的迁移(如果您需要每次都运行它们)。

    如果你想在 docker compose 运行中持久化你的数据(也就是说,当你重启容器时你的数据应该保留);那么您需要针对您的主机的持久映射或共享的数据卷 - 您也可以在 docker-compose.yml 中进行配置。

    docker-compose 将愉快地运行您提供的任何脚本 - 它不知道是否需要运行它,它只是执行命令。您需要确保您的 pre、post、bootstrap 脚本足够智能,即使它们的有效结果已经被应用,它们也可以重复使用。

    【讨论】:

    • 那么,如果您有多个依赖于迁移的应用程序容器,您会怎么做? compose 是否假设您的迁移应该能够同时运行?有没有办法说“等待任务db_migrations停止后再站起来service1”?
    • 自从我写了这个答案(2015 年)以来,情况发生了很大变化;包括 docker-compose,它现在支持许多功能,例如控制其启动顺序的 setting dependencies of services
    • 我认为depends_on 也有同样的问题。它只控制 order 容器的启动,而不是某些依赖任务是否完成。因此,如果我有一个“setup db”容器,它需要在应用程序容器启动之前运行,我看不到这样做的好方法。您的链接引用了诸如“等待”之类的内容来等待 TCP 连接,但这对我引用的案例并没有真正的帮助。
    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 2021-12-29
    • 2017-03-04
    • 2016-03-03
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多