[英]docker-compose healthcheck does not work in a way it is expected for making container a run first and then container B
我正在使用 docker 组合运行几个相互依赖的服务。 这是 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 运行得更快,并且由于它依赖于后端准备就绪,所以它失败了。
基于以下内容:
和
建议我应该使用我在 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
,因此不再支持在撰写第3版。所以,除非你的搬运工,撰写版本<3的healthcheck
不会帮助你多少。 healthcheck
设置容器的状态(启动、健康或不健康),但docker-compose
不会等到backend
容器健康后再启动app-test
。 Compose中Control startup和shutdown order中的depends_on
是如何工作的有详细说明
作为旁注,撰写文件中的 healthcheck 设置app-test
容器的状态,而不是backend
。
因此,要控制api-test
何时可以启动,您必须包装容器的服务命令。 对于您的特定情况,以下将完成这项工作:
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>'
它每 5 秒尝试连接到backend
(连接超时为 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
...
希望这可以帮助。
它不是localhost
连接字符串。
它应该是后端容器的服务名称:
test: ["CMD", "curl", "-f", "http://backend:3015/readiness"]
如果您使用的是最新的 Docker 桌面(在 Windows 上测试,版本为 4.14.0),则使用depends_on condition: service_healthy
。 例子:
depends_on:
oracle:
condition: service_healthy
注意:compose 的版本令人困惑。 多年来, docker-compose
变成了docker compose
,并且引入了具有重叠版本号的替代实现。 Docker Desktop 随附的版本现在似乎称为docker compose V2 ,您在 docker-compose.yml 文件中通过不包括任何版本号来指明它。 这与传统的 docker-compose V2不同,如果 YAML 文件中没有指定版本,它实际上默认为 docker-compose V1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.