控制 Compose 中的启动和关闭顺序

您可以使用 depends_on 属性来控制服务的启动和关闭顺序。Compose 始终按依赖关系顺序启动和停止容器,依赖关系由 depends_onlinksvolumes_fromnetwork_mode: "service:..." 确定。

一个很好的使用场景是应用程序需要访问数据库。如果两个服务都使用 docker compose up 启动,则有可能因为应用程序服务在数据库服务之前启动而失败,找不到能够处理其 SQL 语句的数据库。

控制启动

启动时,Compose 不会等待容器达到“就绪”状态,而只会等待它正在运行。如果您的关系型数据库系统需要在能够处理传入连接之前启动其自身的其他服务,这可能会导致问题。

检测服务就绪状态的解决方案是使用 condition 属性并指定以下选项之一

  • service_started
  • service_healthy。这指定了在启动依赖服务之前,该依赖项应处于“健康”状态,健康状态由 healthcheck 定义。
  • service_completed_successfully。这指定了在启动依赖服务之前,该依赖项应成功完成运行。

示例

services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy
        restart: true
      redis:
        condition: service_started
  redis:
    image: redis
  db:
    image: postgres
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      retries: 5
      start_period: 30s
      timeout: 10s

Compose 按依赖关系顺序创建服务。dbredisweb 之前创建。

Compose 会等待被标记为 service_healthy 的依赖项通过健康检查。dbweb 创建之前应处于“健康”状态(如 healthcheck 所示)。

restart: true 确保如果 db 由于明确的 Compose 操作(例如 docker compose restart)而被更新或重启,web 服务也会自动重启,从而确保它正确地重新建立连接或依赖关系。

db 服务的 healthcheck 使用 pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB} 命令检查 PostgreSQL 数据库是否就绪。该服务每 10 秒重试一次,最多重试 5 次。

Compose 也按依赖关系顺序移除服务。webdbredis 之前移除。

参考信息

页面选项