我有下面的docker-compose,,在启动myprogram-app.之前,我需要等待服务jhipster-registry启动并接受连接
我尝试了健康检查的方法,跟随官方的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"但是,在运行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我是不是做错了什么,还是这个特性不再受支持?如何实现服务之间的同步?
更新版
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注册表的容器是不健康的,但是它可以通过浏览器到达。如何修复健康检查中的命令以使其正常工作?
发布于 2018-09-13 23:06:17
文档建议,在Docker 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取决于您对程序及其库的控制程度,更好的方法是,您可以安排服务能够在不需要依赖项的情况下启动(如果它的依赖项在运行时依赖关系消失),而不使用depends_on:选项。例如,如果数据库关闭,您可能返回HTTP503服务不可用错误。另一个经常有用的策略是,如果您的依赖项不可用,则立即退出,但使用设置 (如restart: on-error )请求协调器重新启动服务。
发布于 2020-04-30 13:00:03
更新到3+.版本
请遵循版本3中的文档:
在使用
depends_on时,需要注意以下几点:depends_on不会等待db和redis在启动web之前“做好准备”--直到它们已经启动。 如果您需要等待服务准备就绪,请参阅控制启动顺序以获得有关此问题的更多信息和解决该问题的策略。depends_on**.**版本3不再支持的条件形式。 在部署具有版本3组合文件的群集模式中的堆栈时,将忽略depends_on选项。
我会考虑使用政策选项来配置您的myprogram-应用程序来重新启动,直到jhipster注册中心启动并接受连接:
restart_policy:
condition: on-failure
delay: 3s
max_attempts: 5
window: 60s发布于 2019-04-15 08:27:26
虽然你已经得到了一个答案,但应该提到的是,你想要达到的目标有一些危险。
理想情况下,服务应该自给自足且足够聪明,可以重试并等待依赖项可用(在崩溃之前)。否则,您将更容易暴露在传播到其他服务的一个失败中。还请考虑一下,与手动启动不同,系统重新启动可能会忽略依赖项顺序。
如果一次服务崩溃导致您的所有系统崩溃,您可能有一个工具来重新启动所有的东西,但是最好有能够抵抗这种情况的服务。
https://stackoverflow.com/questions/52322800
复制相似问题