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

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

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

控件启动

启动时,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 等待运行状况检查传递标有 . 在创建之前应为 “healthy” (如 所示)。service_healthydbhealthcheckweb

restart: true确保由于显式 Compose 操作(例如)而更新或重新启动,则服务也会自动重新启动,从而确保它正确地重新建立连接或依赖项。dbdocker compose restartweb

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

Compose 还会按依赖项顺序删除服务。 在 和 之前删除。webdbredis

参考资料