是否有连续运行Docker容器的中间件?

时间:2017-05-24 00:10:19

标签: docker

例如,当我有Docker容器A,B和C彼此具有不同的运行时,我想连续运行它们。

A -> (wait A done) -> B -> (wait B done) -> C

是否有任何中间件可以实现这一点?或者我可以用docker-compose左右这样做吗?

1 个答案:

答案 0 :(得分:2)

做事“Docker方式”一切都应该被视为它自己的独立微服务,因为这样的docker / docker compose没有内置任何东西来做到这一点。 Compose将始终按顺序启动依赖项,但它不会等待它们完成启动,因此它无法执行诸如等待数据库服务器在启动Web服务器之前启动之类的操作。

此处提供了大量有关此主题的信息:https://docs.docker.com/compose/startup-order/

我在下面提供了一个简短的摘要:

如果依赖性容器是网络服务

wait-for-it允许您在运行命令之前等待端口可访问(例如来自https://docs.docker.com/compose/startup-order/

version: "2"
services:
  web:
    build: .
    ports:
      - "80:8000"
    depends_on:
      - "db"
    command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
  db:
    image: postgres

如果它不是网络服务或“已完成”条件比端口只是访问文件更复杂

或者,您需要实现一个包装脚本,在启动当前容器服务之前确认服务可用(取自https://docs.docker.com/compose/startup-order/

#!/bin/bash
# wait-for-postgres.sh

set -e

host="$1"
shift
cmd="$@"

until psql -h "$host" -U "postgres" -c '\l'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

>&2 echo "Postgres is up - executing command"
exec $cmd