我经常遇到这个问题,在Docker中创建堆栈。假设我在docker-compose.yml中有一个LAMP堆栈:
db:
image: mysql
environment:
MYSQL_VARIOUS: things
web:
build: .
links:
- db
ports:
- "80"
entrypoint:
- setup-and-start
setup-and-start
脚本如下所示:
wait_for_mysql && initialize
如果Web容器上安装了mysql-client,那么我可以轻松定义wait_for_mysql
:
wait_for_mysql() {
local timeout=10
while sleep 1; do
mysql [credentials] -e 'select 1;' && return 0
(( --timeout <= 0 )) && break
done
echo 'Failed to initialize mysql within time limit.' >&2
return 1
}
但是很多集装箱都没有客户。而不是将其安装到每个轻量级容器中,是否有合理的方法可以在初始化应用程序之前检查mysql是否已启动并运行?它应该适用于大多数Docker容器,但不一定是mysql的完美验证;甚至可以接受检查预期的telnet响应(除了telnet在docker镜像上也不常见)。
答案 0 :(得分:2)
问题包含在Docker Compose FAQ中。简短的回答没有好办法,这是设计的。虽然这个用例在测试中很常见,但任何重要系统的小应用程序{{1}}都是反模式。
等待数据库准备就绪的问题实际上只是一个问题 分布式系统更大问题的子集。在生产中, 您的数据库可能会变得不可用或随时移动主机。该 应用程序需要能够适应这些类型的故障。