我有两个Python服务,即first_service和second_service。以下是 docker compose 文件:
version: '3'
services:
first_service:
build: ./first_service
container_name: first_service
depends_on:
second_service:
condition: service_healthy
restart: on-failure
links:
- second_service
second_service:
build: ./second_service
container_name: second_service
volumes:
- /home/user/settings/condition/second_service:/app/second_service
- /home/user/settings:/app/settings
healthcheck:
test: ["CMD-SHELL", "test -f /app/settings/archive.sh && grep -q 'saket' /app/settings/archive.sh || exit 1"]
interval: 5s
timeout: 10s
start_period: 10s
当我运行
docker compose up -d
时,second_service 进入状态 Up 34 seconds (unhealthy)
,first_service 进入状态 Created
。当第二个服务在一段时间后变得健康时,即Up 38 seconds (healthy)
,第一服务仍处于Created
状态。
我尝试使用
depends_on
和 service_healthy
选项,但它没有完成动机。我希望一旦 secondary_service 在任何时间变得健康,first_service 就能启动并运行。它应该仅通过 docker compose 文件发生。
如果我重现你的示例,它看起来像
docker compose
退出:
$ docker compose up
[+] Running 3/2
✔ Network containers_default Created 0.1s
✔ Container containers-second_service-1 Created 0.0s
✔ Container containers-first_service-1 Created 0.0s
Attaching to first_service-1, second_service-1
second_service-1 | darkhttpd/1.14, copyright (c) 2003-2022 Emil Mikulic.
dependency failed to start: container containers-second_service-1 is unhealthy
因为 compose 退出,它不再管理容器,所以即使
second_service
变得健康,也没有什么等待启动 first_service
。这显然是预期的行为,尽管我觉得这令人惊讶。
解决方案是增加您的
start_period
,以便 second_service
在 start_period
到期时保持健康。例如:
second_service:
build: ./second_service
container_name: second_service
volumes:
- /home/user/settings/condition/second_service:/app/second_service
- /home/user/settings:/app/settings
healthcheck:
test: ["CMD-SHELL", "test -f /app/settings/archive.sh && grep -q 'saket' /app/settings/archive.sh || exit 1"]
interval: 5s
timeout: 10s
start_period: 30s