在 Compose 中控制启动和关闭顺序
目录
您可以使用 depends_on 属性控制服务的启动和关闭顺序。Compose 始终按依赖顺序启动和停止容器,其中依赖关系由depends_on
、links
、volumes_from
和 network_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 按依赖顺序创建服务。db
和 redis
在 web
之前创建。
Compose 等待使用service_healthy
标记的依赖项的健康检查通过。在创建web
之前,预期db
是“健康”(如healthcheck
所示)。
restart: true
确保如果由于显式 Compose 操作(例如docker compose restart
)而更新或重启了db
,则web
服务也会自动重启,确保它正确重新建立连接或依赖关系。
db
服务的健康检查使用pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'
命令检查PostgreSQL数据库是否已准备就绪。服务每 10 秒重试一次,最多 5 次。
Compose 还按依赖顺序移除服务。web
在db
和redis
之前移除。