gpt4 book ai didi

docker-compose healthcheck 无法按照预期先运行容器然后运行容器 B 的方式工作

转载 作者:行者123 更新时间:2023-12-02 07:17:20 25 4
gpt4 key购买 nike

我正在使用 docker compose 来运行几个相互依赖的服务。这是 docker-compose 的一部分:

  backend:
build: .
command: bash -c "npm run build && npm start"
ports:
- "3015:3015"
depends_on:
- couchdb
- redis
- uds-mock-server
volumes:
- /app/node_modules
- .:/app
user: root
api-test:
restart: always
build: .
depends_on:
- backend
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3015/readiness"]
interval: 200s
timeout: 200s
retries: 5
user: root

如你所见,我在那里有两个服务,后端应该首先运行,服务器需要准备好然后 api-test 可以启动。后端有一个端点: localhost:2015/readiness 并且只要它返回 200 就可以开始 api 测试。当我在构建订单时运行,所以后端首先是 api-mock,但是当 docker compose 开始运行它们时,api-test 运行得更快,因为它依赖于后端准备好它失败。

基于以下几点:

Docker Compose wait for container X before starting Y



Docker healthcheck in composer file

建议我应该使用我在 api 测试中所做的健康检查:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3015/readiness"]
interval: 200s
timeout: 200s
retries: 5

如果我得到正确的 api-test 应该运行并调用就绪端点并等到它从后端就绪(最多 200 秒)中听到如果失败,它会等待 200 秒,然后再试 5 次。
但是我看到的是 api-test 不断失败并重新启动,甚至没有给后端运行的机会,它像循环一样一直这样做。
我错过了什么吗?任何帮助真的很感激

最佳答案

这两个示例基于 condition depends_on 的表格compose 版本 3 不再支持它。因此,除非您的 docker-compose 版本 <3 healthcheck不会对你有多大帮助。 healthcheck设置容器的状态(启动、健康或不健康)但 docker-compose不等到backend容器在启动之前是健康的 app-test .关于如何depends_on有详细的解释工作于 Control startup and shutdown order in Compose
作为旁注,撰写文件中的健康检查设置了 app-test 的状态。容器而不是 backend .
因此要控制时api-test可以启动,还得包装容器的service命令。对于您的特定情况,以下将完成这项工作:

bash -c 'while [[ "$(curl --connect-timeout 2 -s -o /dev/null -w ''%{http_code}'' https://backend:3015/readiness)" != "200" ]]; do echo ..; sleep 5; done; echo backend is up; <service_command>'
它尝试连接到 backend每 5 秒一次(连接超时为 2 秒)。当接收到的 HTTP 状态代码为 200 OK 时,循环结束并执行 <service_command>相关的 docker-compose 部分:
  api-test:
restart: always
command: bash -c 'while [[ "$$(curl --connect-timeout 2 -s -o /dev/null -w ''%{http_code}'' uds-mock-server:4000/readiness)" != "200" ]]; do echo ..; sleep 5; done; echo backend is up;npm start'
depends_on:
- backend
...
希望这可以帮助。

关于docker-compose healthcheck 无法按照预期先运行容器然后运行容器 B 的方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59062517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com