首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >码头-撰写:如何等待其他服务准备好?

码头-撰写:如何等待其他服务准备好?
EN

Stack Overflow用户
提问于 2018-09-13 22:57:33
回答 6查看 41.5K关注 0票数 27

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

我尝试了健康检查的方法,跟随官方的https://docs.docker.com/compose/compose-file/compose-file-v2/医生

代码语言:javascript
复制
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"

但是,在运行docker-compose up时,我会得到以下错误

代码语言:javascript
复制
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

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

更新版

代码语言:javascript
复制
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"

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

代码语言:javascript
复制
ERROR: for myprogram-app  Container "8ebca614590c" is unhealthy.
ERROR: Encountered errors while bringing up the project.

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-09-13 23:06:17

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

代码语言:javascript
复制
depends_on:
  # notice: these lines don't start with "-"
  jhipster-registry:
    condition: service_healthy
  myprogram-postgresql:
    condition: service_started
  myprogram-elasticsearch:
    condition: service_started

取决于您对程序及其库的控制程度,更好的方法是,您可以安排服务能够在不需要依赖项的情况下启动(如果它的依赖项在运行时依赖关系消失),而不使用depends_on:选项。例如,如果数据库关闭,您可能返回HTTP503服务不可用错误。另一个经常有用的策略是,如果您的依赖项不可用,则立即退出,但使用设置 (如restart: on-error )请求协调器重新启动服务。

票数 13
EN

Stack Overflow用户

发布于 2020-04-30 13:00:03

更新到3+.版本

请遵循版本3中的文档

在使用depends_on时,需要注意以下几点: depends_on不会等待db和redis在启动web之前“做好准备”--直到它们已经启动。 如果您需要等待服务准备就绪,请参阅控制启动顺序以获得有关此问题的更多信息和解决该问题的策略。 depends_on**.**版本3不再支持的条件形式。 在部署具有版本3组合文件的群集模式中的堆栈时,将忽略depends_on选项。

我会考虑使用政策选项来配置您的myprogram-应用程序来重新启动,直到jhipster注册中心启动并接受连接:

代码语言:javascript
复制
 restart_policy:
        condition: on-failure
        delay: 3s
        max_attempts: 5
        window: 60s
票数 11
EN

Stack Overflow用户

发布于 2019-04-15 08:27:26

虽然你已经得到了一个答案,但应该提到的是,你想要达到的目标有一些危险。

理想情况下,服务应该自给自足且足够聪明,可以重试并等待依赖项可用(在崩溃之前)。否则,您将更容易暴露在传播到其他服务的一个失败中。还请考虑一下,与手动启动不同,系统重新启动可能会忽略依赖项顺序。

如果一次服务崩溃导致您的所有系统崩溃,您可能有一个工具来重新启动所有的东西,但是最好有能够抵抗这种情况的服务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52322800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档