Docker-Compose:如何等待其他服务准备就绪?

1Z1*_*Z10 0 wait docker docker-compose

我有以下docker-compose,在启动myprogram-app之前,我需要等待服务jhipster-registry启动并接受连接。

我按照官方文档https://docs.docker.com/compose/compose-file/compose-file-v2/尝试了healtcheck方法

version: '2.1'
services:
    myprogram-app:
        image: myprogram
        mem_limit: 1024m
        environment:
            - SPRING_PROFILES_ACTIVE=prod,swagger
            - EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/eureka
            - SPRING_CLOUD_CONFIG_URI=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/config
            - SPRING_DATASOURCE_URL=jdbc:postgresql://myprogram-postgresql:5432/myprogram
            - JHIPSTER_SLEEP=0
            - SPRING_DATA_ELASTICSEARCH_CLUSTER_NODES=myprogram-elasticsearch:9300
            - JHIPSTER_REGISTRY_PASSWORD=53bqDrurQAthqrXG
            - EMAIL_USERNAME
            - EMAIL_PASSWORD
        ports:
            - 8080:8080
        networks:
          - backend
        depends_on:
          - jhipster-registry:
              "condition": service_started
          - myprogram-postgresql
          - myprogram-elasticsearch
    myprogram-postgresql:
        image: postgres:9.6.5
        mem_limit: 256m
        environment:
            - POSTGRES_USER=myprogram
            - POSTGRES_PASSWORD=myprogram
        networks:
          - backend
    myprogram-elasticsearch:
        image: elasticsearch:2.4.6
        mem_limit: 512m
        networks:
          - backend
    jhipster-registry:
        extends:
            file: jhipster-registry.yml
            service: jhipster-registry
        mem_limit: 512m
        ports:
            - 8761:8761
        networks:
          - backend
        healthcheck:
          test: "exit 0"
networks:
  backend:
    driver: "bridge"
Run Code Online (Sandbox Code Playgroud)

但运行时出现以下错误docker-compose up

ERROR: The Compose file './docker-compose.yml' is invalid because:
services.myprogram-app.depends_on contains {"jhipster-registry": {"condition": "service_started"}}, which is an invalid type, it should be a string
Run Code Online (Sandbox Code Playgroud)

我做错什么了,还是不再支持此功能?如何实现服务之间的同步?

更新后的版本

version: '2.1'
services:
    myprogram-app:
        image: myprogram
        mem_limit: 1024m
        environment:
            - SPRING_PROFILES_ACTIVE=prod,swagger
            - EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/eureka
            - SPRING_CLOUD_CONFIG_URI=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/config
            - SPRING_DATASOURCE_URL=jdbc:postgresql://myprogram-postgresql:5432/myprogram
            - JHIPSTER_SLEEP=0
            - SPRING_DATA_ELASTICSEARCH_CLUSTER_NODES=myprogram-elasticsearch:9300
            - JHIPSTER_REGISTRY_PASSWORD=53bqDrurQAthqrXG
            - EMAIL_USERNAME
            - EMAIL_PASSWORD
        ports:
            - 8080:8080
        networks:
          - backend
        depends_on:
          jhipster-registry:
            condition: service_healthy
          myprogram-postgresql:
            condition: service_started
          myprogram-elasticsearch:
            condition: service_started
        #restart: on-failure
    myprogram-postgresql:
        image: postgres:9.6.5
        mem_limit: 256m
        environment:
            - POSTGRES_USER=myprogram
            - POSTGRES_PASSWORD=tuenemreh
        networks:
          - backend
    myprogram-elasticsearch:
        image: elasticsearch:2.4.6
        mem_limit: 512m
        networks:
          - backend
    jhipster-registry:
        extends:
            file: jhipster-registry.yml
            service: jhipster-registry
        mem_limit: 512m
        ports:
            - 8761:8761
        networks:
          - backend
        healthcheck:
          test: ["CMD", "curl", "-f", "http://jhipster-registry:8761", "|| exit 1"]
          interval: 30s
          retries: 20
          #start_period: 30s
networks:
  backend:
    driver: "bridge"
Run Code Online (Sandbox Code Playgroud)

更新版本给我一个不同的错误,

ERROR: for myprogram-app  Container "8ebca614590c" is unhealthy.
ERROR: Encountered errors while bringing up the project.
Run Code Online (Sandbox Code Playgroud)

说jhipster-registry的容器不健康,但是可以通过浏览器访问。如何在运行状况检查中修复命令以使其正常运行?

Kyl*_*Mit 23

最佳方法 - 弹性应用程序启动

虽然 docker确实支持启动依赖项,但他们官方建议更新您的应用程序启动逻辑以测试外部依赖项的可用性并重试。这对于强大的应用程序来说有很多好处,除了可以规避竞争条件之外,这些应用程序还可以在野外重新启动。docker compose up

depends_on& service_healthy- 撰写 1.27.0 +

depends_on又回到了Compose 规范中的 docker compose v1.27.0+(在 v3 中已弃用)

每个服务还应该实施service_healthy检查,以便能够报告它是否已完全设置并准备好用于下游依赖项。

version: '3.0'
services:
  php:
    build:
      context: .
      dockerfile: tests/Docker/Dockerfile-PHP
    depends_on:
      redis:
        condition: service_healthy
  redis:
    image: redis
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 1s
      timeout: 3s
      retries: 30
Run Code Online (Sandbox Code Playgroud)

wait-for-it.sh

根据 docker 关于Compose 中控制启动和关闭顺序的文档,推荐的方法是下载wait-for-it.sh并接受domain:port轮询,然后在成功时执行下一组命令。

version: "2"
services:
  web:
    build: .
    ports:
      - "80:8000"
    depends_on:
      - "db"
    command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
  db:
    image: postgres
Run Code Online (Sandbox Code Playgroud)

注意:这需要覆盖映像的启动命令,因此请确保您知道要传递什么来维持默认启动的奇偶校验。

进一步阅读


Rtm*_*tmY 8

更新到版本 3+。

请遵循第 3 版中的文档

使用时有几点需要注意depends_on

depends_on在启动 web 之前不会等待 db 和 redis “准备好” - 只在它们启动之前。
如果您需要等待服务准备就绪,请参阅控制启动顺序以了解有关此问题的更多信息以及解决该问题的策略。
版本 3 不再支持depends_on. 在使用版本 3 Compose 文件以 swarm 模式部署堆栈时,将忽略
depends_on选项。

我会考虑使用restart_policy选项来配置您的myprogram-app重新启动,直到jhipster-registry启动并接受连接:

 restart_policy:
        condition: on-failure
        delay: 3s
        max_attempts: 5
        window: 60s
Run Code Online (Sandbox Code Playgroud)

  • 正如许多人上面指出的那样,他们似乎_do_在规范中支持这一点:https://github.com/peter-evans/docker-compose-healthcheck/issues/3#issuecomment-790332404 (3认同)

COi*_*Oil 7

借助新的 docker compose API,我们现在可以使用新--wait选项:

docker compose up --wait
Run Code Online (Sandbox Code Playgroud)

如果您的服务有健康检查,Docker 会等待直到它具有“健康”状态;否则,它将等待服务启动。这就是为什么对所有服务进行相关的健康检查至关重要。

请注意,此选项会自动激活该--detach选项。

查看此处的文档。


Dav*_*aze 5

文档建议,特别是在Docker Compose版本2文件中depends_on:可以是字符串列表,也可以是键为服务名称而值为条件的映射。对于您没有(或不需要)健康检查的服务,有一个service_started条件。

depends_on:
  # notice: these lines don't start with "-"
  jhipster-registry:
    condition: service_healthy
  myprogram-postgresql:
    condition: service_started
  myprogram-elasticsearch:
    condition: service_started
Run Code Online (Sandbox Code Playgroud)

根据对程序及其程序库的控制程度,最好安排服务能够在不必依赖其依赖项的情况下启动(等效地,如果依赖项在服务运行时消失,则可以正常运行) ,而不使用该depends_on:选项。例如,如果数据库关闭,则可能返回HTTP 503服务不可用错误。经常有用的另一种策略是,如果您的依赖项不可用,则立即退出,但要使用一种设置,例如restart: on-error要求协调器重新启动服务。

  • 这又是相关​​的。从 docker-compose 1.27.0 开始,它支持 v3 的 COMPOSE_SPEC 标准,其中包括 `condition` 的 [`condition`](https://github.com/compose-spec/compose-spec/blob/master/spec.md#depends_on)取决于`,请参阅[发行说明](https://github.com/docker/compose/releases/tag/1.27.0) (8认同)
  • 这个答案不再重要了。从文档中:```版本3不再支持depends_on的条件形式 (5认同)
  • [curl 手册页](https://curl.haxx.se/docs/manpage.html) 有一个非常详尽的退出代码列表;[Docker HEALTHCHECK 文档](https://docs.docker.com/engine/reference/builder/#healthcheck) 建议`curl -f http://localhost/ || exit 1` 作为典型的健康检查(这需要您的图像安装 curl)。 (2认同)

归档时间:

查看次数:

3844 次

最近记录:

6 年,9 月 前