Docker Compose Wait til依赖项容器在启动前已完全启动

Chr*_*ord 5 docker docker-compose

我正在使用docker-compose使用docker服务,并且我有一个依赖于花药的服务。

我使用了depends_on密钥,但是具有依赖项的服务在依赖服务完全启动之前启动。

version: '3'

services:
  KeyManager:
    image: cjrutherford/keymanager
    deploy:
      replicas: 1
    ports:
      - '3220:3220'
    networks:
      - privnet
  YellowDiamond:
    image: cjrutherford/server
    depends_on:
      - KeyManager
    deploy:
      replicas: 1
    ports:
      - '3000:3000'
    networks:
      - privnet
      - web
networks:
  privnet:
    internal: true
  web:
Run Code Online (Sandbox Code Playgroud)

这两个都是节点应用程序,要求密钥管理器在服务器启动之前运行以接受请求。我可以添加超时吗?或在应用程序中发送触发器?从经理那里获取钥匙还为时过早。

Dan*_*nyB 24

您可能正在寻找 docker composehealthcheckdepends_on.

此功能的行为在 docker-copmose 版本之间发生了变化,因此这里是更新的方法(此 docker-compose 文件按原样工作):

services:
  db:
    image: postgres
    environment:
      - POSTGRES_USER=king
      - POSTGRES_DB=kong
      - POSTGRES_HOST_AUTH_METHOD=trust
    healthcheck:
      test: pg_isready -U postgres

  web:
    image: alpine
    depends_on: 
      db:
        condition: service_healthy
Run Code Online (Sandbox Code Playgroud)

然后运行docker-compose run web​​,它会等待数据库才开始。

该指令还有更详细的形式healthcheck

healthcheck:
  test: ["CMD-SHELL", "pg_isready -U postgres"]
  interval: 10s
  timeout: 5s
  retries: 5
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 这需要 docker-compose 1.27.0或更高版本
  2. 为了使其工作,撰写文件不得包含version指令(参考

  • docker-compose 1.27.0 中的版本 3 再次对此进行了更改,支持条件形式。请参阅 https://docs.docker.com/compose/release-notes/#1270(“COMPOSE_SPEC”) (4认同)

dev*_*ops 10

我经常发现使用等待它的 bash 脚本比对 docker-compose 的内置健康检查更有效。

这会针对给定端口运行 TCP 健康检查,并在开始运行进程之前等待检查完成。

示例代码:

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)

这是一些文档: