繁体   English   中英

docker-compose healthcheck 没有按照预期的方式工作,首先运行容器 A,然后运行容器 B

[英]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 运行得更快,并且由于它依赖于后端准备就绪,所以它失败了。

基于以下内容:

Docker Compose 在启动 Y 之前等待容器 X

Docker composer 文件中的健康检查

建议我应该使用我在 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 ComposeControl 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM