【问题标题】:Docker Compose Wait til dependency container is fully up before launchingDocker Compose 等到依赖容器完全启动后再启动
【发布时间】:2019-04-03 18:45:25
【问题描述】:

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

我使用了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:

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

【问题讨论】:

标签: docker docker-compose


【解决方案1】:

我经常发现使用等待它的 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

这里有一些文档:

【讨论】:

  • 这太棒了,但我确实对这个答案有疑问。如果您不在 compose 中构建图像,您将如何做到这一点? (即具有依赖关系的预构建图像)
  • 您可以将它添加到 Dockerfile 中的 ENTRYPOINT 命令/脚本中,这样它会在容器启动时运行。 (虽然您将无法使用 docker-compose 内部 DNS(即“db”)引用另一个容器,但您需要根据您的设置以另一种方式执行此操作。
【解决方案2】:

您可能正在寻找 docker compose healthcheckdepends_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

然后运行docker-compose run web,它会等待数据库再启动。

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

healthcheck:
  test: ["CMD-SHELL", "pg_isready -U postgres"]
  interval: 10s
  timeout: 5s
  retries: 5

注意事项:

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

【讨论】:

【解决方案3】:

我在 centos 8 上的 nodejs 上使用 wait-for-it.sh 并得到以下错误。

myimage-data-api | /usr/src/app/wait-for-it.sh:2
myimage-data-api | # Use this script to test if a given TCP host/port 
are available
myimage-data-api | ^
myimage-data-api | 
myimage-data-api | SyntaxError: Invalid or unexpected token
myimage-data-api |     at Object.compileFunction (node:vm:352:18)
myimage-data-api |     at wrapSafe 
(node:internal/modules/cjs/loader:1026:15)
myimage-data-api |     at Module._compile 
(node:internal/modules/cjs/loader:1061:27)
myimage-data-api |     at Object.Module._extensions..js 
(node:internal/modules/cjs/loader:1149:10)
myimage-data-api |     at Module.load 
(node:internal/modules/cjs/loader:975:32)
myimage-data-api |     at Function.Module._load 
(node:internal/modules/cjs/loader:822:12)
myimage-data-api |     at Function.executeUserEntryPoint [as runMain] 
(node:internal/modules/run_main:81:12)
myimage-data-api |     at node:internal/main/run_main_module:17:47
myimage-data-api | 
myimage-data-api | Node.js v17.3.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 2019-12-21
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多