K
K
Kumu's wiki
搜索文档…
Compose 启动顺序控制
你可以通过 depends_on 选项控制服务启动顺序。Compose 总是按照依赖的顺序启动和停止容器,依赖包括 depends_onlinksvolumes_from 以及 network_mode: "service:..."
Compose 启动不会等到容器中服务就绪,而只要容器启动即可。简单来说,Compose 不管这一层,官档的意思是应用程序应该考虑应对依赖的服务没有启动的情况。最好的方式就是代码中处理好这块逻辑,如果不行的话可以封装一些脚本曲线解决问题:
    使用如 wait-for-itdockerize 或者 shell 兼容的 wait-for 这类的工具。这些小型的封装脚本,可以把这些加入到镜像中,以轮询给定的主机和端口,直到它接受 TCP 连接为止。如使用 wait-for-it.sh 或者 wait-for 封装你的服务命令:
1
version: "3"
2
services:
3
web:
4
build: .
5
ports:
6
- "80:8000"
7
depends_on:
8
- "db"
9
command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
10
db:
11
image: postgres
Copied!
使用这类的工具好处使方便,坏处也有,比如服务端口监听并不表示服务已经可以对外提供服务了,这种细粒度的事情,这些脚本做不了,可以使用下面的解决方式。
    或者编写自己的封装脚本以执行更特定于应用程序运行状态的检测,如等到 Postgres 准备好接受命令为止:
1
#!/bin/sh
2
# wait-for-postgres.sh
3
4
set -e
5
6
host="$1"
7
shift
9
10
until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c '\q'; do
11
>&2 echo "Postgres is unavailable - sleeping"
12
sleep 1
13
done
14
15
>&2 echo "Postgres is up - executing command"
16
exec $cmd
Copied!
定制好了之后通过如下方式设置:
1
command: ["./wait-for-postgres.sh", "db", "python", "app.py"]
Copied!
最近更新 1yr ago
复制链接