无法使用docker compose启动依赖容器

问题描述 投票:0回答:1

我有两个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
1个回答
0
投票

如果我重现你的示例,它看起来像

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
© www.soinside.com 2019 - 2024. All rights reserved.