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)
注意:这需要覆盖映像的启动命令,因此请确保您知道要传递什么来维持默认启动的奇偶校验。
更新到版本 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)
借助新的 docker compose API,我们现在可以使用新--wait选项:
docker compose up --wait
Run Code Online (Sandbox Code Playgroud)
如果您的服务有健康检查,Docker 会等待直到它具有“健康”状态;否则,它将等待服务启动。这就是为什么对所有服务进行相关的健康检查至关重要。
请注意,此选项会自动激活该--detach选项。
查看此处的文档。
该文档建议,特别是在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要求协调器重新启动服务。
| 归档时间: |
|
| 查看次数: |
3844 次 |
| 最近记录: |