©
本文档使用 PHP中文网手册 发布
您可以使用depends_on选项来控制服务启动的顺序。撰写总是依赖顺序,其中依赖性是通过确定启动容器depends_on
,links
,volumes_from
,和network_mode: "service:..."
。
但是,Compose不会等到容器“准备就绪”(无论对于您的特定应用程序而言意味着什么) - 直到它运行为止。这有一个很好的理由。
等待数据库(例如)准备就绪的问题实际上只是分布式系统的一个更大问题的一个子集。在生产中,您的数据库可能随时无法使用或移动主机。您的应用程序需要适应这些类型的故障。
为了处理这个问题,应用程序应该尝试在失败后重新建立到数据库的连接。如果应用程序重试连接,它应该最终能够连接到数据库。
最好的解决方案是在你的应用程序代码中执行这个检查,无论是在启动时,还是因任何原因丢失连接。但是,如果您不需要此级别的恢复能力,则可以使用包装脚本解决该问题:
使用一个工具,如等待,dockerize或sh兼容等待。这些小包装脚本可以包含在应用程序的映像中,并将轮询给定的主机和端口,直到它接受TCP连接。例如,要使用wait-for-it.sh
或wait-for
包装服务的命令:version:“2”services:web:build:。端口: - “80:8000”depends_on: - “db”命令:“./wait-for-it.sh”,“db:5432”,“ - ”,“python”,“app.py”db: image:postgres 提示:这种第一种解决方案存在局限性; 例如,它不会验证特定服务何时准备就绪。如果您为命令添加更多参数,bash shift
带循环的命令,如下一个示例所示。
或者,编写自己的包装脚本以执行更多特定于应用程序的运行状况检查。例如,您可能要等到Postgres完全准备好接受命令:#!/ bin / bash#wait-for-postgres.sh set -e host =“$ 1”shift cmd =“$ @”,直到psql -h “$ host”-U“postgres”-c'\ l'; do>&2 echo“Postgres is unavailable - sleeping”sleep 1 done>&2 echo“Postgres正在执行 - 执行命令”exec $ cmd您可以像上例那样使用它作为包装脚本,方法是:command:“./ wait-for-postgres.sh“,”db“,”python“,”app.py“