在 Compose 中控制启动和关闭顺序
目录
您可以使用 depends_on 属性控制服务启动和关闭的顺序。Compose 始终会启动和停止
容器按依赖关系顺序排列,其中依赖关系由depends_on
,links
,volumes_from
和network_mode: "service:..."
.
一个很好的例子是需要访问数据库的应用程序。如果两个服务都以docker compose up
,这可能会导致失败,因为应用程序服务可能在数据库服务之前启动,并且找不到能够处理其 SQL 语句的数据库。
控件启动
启动时,Compose 不会等到容器“准备就绪”,而只会等到容器正在运行。例如,如果您的关系数据库系统需要先启动自己的服务,然后才能处理传入连接,这可能会导致问题。
检测服务就绪状态的解决方案是使用condition
属性替换为以下选项之一:
service_started
service_healthy
.这指定了依赖项应为 “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
.db
应为“正常”(如healthcheck
) 之前web
已创建。
restart: true
确保 ifdb
会因显式 Compose作而更新或重启,例如docker compose restart
这web
Service 也会自动重启,确保它正确地重新建立连接或依赖项。
的db
service 使用pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'
命令检查 PostgreSQL 数据库是否已准备就绪。该服务每 10 秒重试一次,最多 5 次。
Compose 还会按依赖项顺序删除服务。web
之前已删除db
和redis
.