当前位置: 首页 > 知识库问答 >
问题:

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

陶英纵
2023-03-14

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

我尝试了 healtcheck 方式,遵循官方文档 https://docs.docker.com/compose/compose-file/compose-file-v2/

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"

但在运行<code>docker compose up</code>时,我遇到了以下错误:

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

是我做错了什么,还是这个特性不再被支持了?如何实现服务之间的同步?

更新版本

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"

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

ERROR: for myprogram-app  Container "8ebca614590c" is unhealthy.
ERROR: Encountered errors while bringing up the project.

说jhipster注册表的容器不健康,但可以通过浏览器访问。如何修复健康检查中的命令以使其正常工作?

共有3个答案

丌官昊天
2023-03-14

更新到版本 3 .

请遵循版本3中的文档:

使用depends_on时需要注意以下几点:

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

我会考虑使用restart_policy选项来配置您的myProgram应用程序以重新启动,直到jhipster注册表启动并接受连接:

 restart_policy:
        condition: on-failure
        delay: 3s
        max_attempts: 5
        window: 60s
尉迟宣
2023-03-14

文档建议,在Docker Compose版本2文件中,< code>depends_on:可以是一个字符串列表,或者是一个映射,其中键是服务名,值是条件。对于您没有(或不需要)健康检查的服务,有一个< code>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

根据您对程序及其库的控制程度,如果您可以安排服务在不必依赖项可用的情况下启动(等价地,如果其依赖项在服务运行时消失,则运行),并且不使用<code>depends_on:

苍德寿
2023-03-14

虽然docker确实支持启动依赖项,但他们正式建议更新您的应用程序启动逻辑以测试外部依赖项的可用性和重试。这对于可能在野外动态重启的强大应用程序有很多好处,除了可以绕过docker组合中的竞争条件

docker根据他们的文档在Compose中的Control启动和关闭顺序推荐的方法是下载wait-for-it.sh,它在域: 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

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

过去,您可以定义一个< code>healthcheck(仍然是一个好的做法),然后将< code>depends_on的条件设置为< code>service_healthy,但是在3.0中不推荐使用< code>depends_on的条件变量

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
  • Docker Compose在启动Y之前等待容器X
  • docker_compose.yml中链接和depends_on的区别
  • 如何等待docker容器启动并运行?
  • Docker Compose在启动之前等待依赖容器完全启动
  • depends_on不等待docker-compose 1.22.0中的另一个服务
 类似资料:
  • 我试图在我的中使用waet-for-it来等待mysql准备就绪,然后再创建依赖于它的服务。这是我的: 尝试使用docker compose运行此操作时出现以下错误: 开始集成tests_mysql_1错误 错误:对于集成-tests_mysql_1无法开启服务mysql:OCI运行时创建失败:container_linux.go:348:启动容器进程导致"exec: \"./ wait-for-

  • 我现在的码头工人。yml- 我的码头工人。yml文件包含2个服务。我已经指定postgrasdb服务在python应用程序服务使用之前启动,但是docker没有按照指定的顺序运行服务。如何让postgrasdb服务在python应用程序服务之前运行?我正在运行命令。

  • 那么有没有办法从其他容器的服务状态启动容器??

  • 问题内容: 在JFrame中,当我单击“登录”时,我弹出另一个Jframe,即登录窗口。 在执行其他操作之前,如何使主Jframe等待登录Jframe退出? 问题答案: 只需使用模式对话框代替框架即可,这样在关闭对话框之前您无法做其他任何事情 有关说明,请参见http://mindprod.com/jgloss/modal.html;有关代码示例,请参见http://www.java2s.com/

  • Note: Seafile 服务器 5.0.0 之后,所有配置文件都移动到了统一的 conf 目录下。 了解详情. 从专业版服务器的 2.0.5 版本开始,Seafile 可以使用兼容 S3 的云存储(比如 OpenStack/Swift)作为后端。这篇文档将以使用 Swift 为例。 准备工作 首先您需要为 Swift 启用 S3 的模拟中间件。有关说明可以参考以下链接: http://www.

  • 我正在使用XAMPP运行Apache服务器,希望从同一Wifi网络上的其他设备访问文件。 我尝试使用计算机的IPv4地址,但无法从另一台笔记本电脑连接。我还尝试禁用防火墙,但也没有成功 在此之后,我想从单独网络上的设备访问它。 我在Android系统上使用谷歌云消息传递,它需要发送信息以及读取需要服务器访问的信息。