【问题标题】:How should I be sure DB is up before starting my app with docker compose 3在使用 docker compose 3 启动我的应用程序之前,我应该如何确定 DB 已启动
【发布时间】:2018-07-05 19:03:59
【问题描述】:

我有一个经典的 PHP 7 / MySQL / Nginx API 我想 dockerise

事情是当我运行我的 docker compose 时,应用程序在 db 准备好之前启动,所以它失败了:

version: '3.3'

services:
  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: jaumo
      MYSQL_USER: root
      MYSQL_PASSWORD: password
  app:
    image: repo/myimage
    environment:
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: mydb
          MYSQL_USER: root
          MYSQL_PASSWORD: password
    ports:
      - 8000:80
    depends_on:
          - "db"
volumes:
  db_data:

official doc 声明:

depends_on 在启动 web 之前不会等待 db 和 redis “准备好” - 仅在它们启动之前。如果您需要等待服务准备好,请参阅控制启动顺序以了解有关此问题的更多信息以及解决该问题的策略。

版本 3 不再支持depends_on 的条件形式。

所以基本上,在第 2 版中,我可以添加健康检查条件,这很容易,但现在,我不知道该怎么做,文档也没有提供任何替换方法。

我该怎么办?这是一个很常见的情况......

【问题讨论】:

  • 您是否尝试过在 YML 文件中始终使用相同的缩进?

标签: docker docker-compose


【解决方案1】:

我在之前的一些答案中详细描述了该过程,因为它需要一些解释。这是ref。基本上,您编写一个 wait-for-it 脚本,等待 http 响应 - 然后只有像 postgres/oracle/mysql 这样的数据库才准备好工作。

【讨论】:

  • 你的意思是,像这样:docs.docker.com/compose/startup-order ...我发现它比对我的服务进行健康检查更骇人听闻...
  • 看起来不错,两者都需要一点 bash 脚本,唯一的区别是“我的方法”让您以 docker 方式为给定服务设置先决条件 - 在一个单独的地方 (@987654324 @)。我还没有看到没有使用entrypoints 来支持自定义运行脚本的专业项目。我不会禁止您找到的解决方案,我自己不会使用它,因为会处理终止信号,Docker 声明要小心编写自定义运行脚本,并确保处理您可能想要采取行动的所有系统信号。跨度>
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 2012-11-10
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多