Kumu's wiki
  • SUMMARY
  • Docker
    • 理论概述
    • 安装入门
    • 配置说明
    • 基础命令
    • 镜像构建
    • 镜像存储
      • OverlayFS 存储驱动
      • Habor 安装和升级标注
    • Compose
      • Compose 概览
      • Compose 安装
      • Compose 入门
      • Compose 环境变量
      • Compose 服务扩展
      • Compose 网络
      • Compose 生产实践
      • Compose 启动顺序控制
  • Kubernetes
    • 架构概览
    • 基础术语
    • 集群构建
    • 工作负载
      • Deployments
      • StatefulSets
      • Volumes
      • Persistent Volumes
    • 集群调度
      • 亲和性和反亲和性
      • 污点和容忍机制
    • 集群组件
      • Kubelet
    • 网络方案
      • 网络策略
      • Calico BGP 网络(v2.6.x)
      • Kubelet CNI 源码解析
    • client-go
      • client-go 背后机制
    • Helm
      • Helm 架构
      • Helm 快速上手
      • Helm 使用
      • Helm 命令
    • Google 大规模集群管理器 Borg
由 GitBook 提供支持
在本页

这有帮助吗?

  1. Docker
  2. Compose

Compose 启动顺序控制

上一页Compose 生产实践下一页架构概览

最后更新于5年前

这有帮助吗?

你可以通过 选项控制服务启动顺序。Compose 总是按照依赖的顺序启动和停止容器,依赖包括 depends_on,links,volumes_from 以及 network_mode: "service:..."。

Compose 启动不会等到容器中服务就绪,而只要容器启动即可。简单来说,Compose 不管这一层,官档的意思是应用程序应该考虑应对依赖的服务没有启动的情况。最好的方式就是代码中处理好这块逻辑,如果不行的话可以封装一些脚本曲线解决问题:

  • 使用如 , 或者 shell 兼容的 这类的工具。这些小型的封装脚本,可以把这些加入到镜像中,以轮询给定的主机和端口,直到它接受 TCP 连接为止。如使用 wait-for-it.sh 或者 wait-for 封装你的服务命令:

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

使用这类的工具好处使方便,坏处也有,比如服务端口监听并不表示服务已经可以对外提供服务了,这种细粒度的事情,这些脚本做不了,可以使用下面的解决方式。

  • 或者编写自己的封装脚本以执行更特定于应用程序运行状态的检测,如等到 Postgres 准备好接受命令为止:

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

set -e

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

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

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

定制好了之后通过如下方式设置:

command: ["./wait-for-postgres.sh", "db", "python", "app.py"]
Control startup order
depends_on
wait-for-it
dockerize
wait-for