对于我的应用程序,我使用的是 kafka,我想要一种方法来确保我在尝试在 CI 测试套件中运行应用程序 e2e 测试之前正确等待它准备好。为了实现这一点,我使用了
until
bash 关键字,并在日志中查找一行以表明它已准备就绪,started (kafka.server.KafkaServer)
。完整的设置是:
until docker compose logs kafka 2>/dev/null | grep -q "started (kafka.server.KafkaServer)"; do
sleep 1
done
我发现如果这个循环在kafka完全启动并准备好之前运行,那么until会按预期循环,直到kafka正确准备好。但是,如果此循环在 docker 容器启动后运行,则循环永远不会结束,并且从我的测试中,我从中得到一致的 255 错误代码。但是,如果我在循环中添加相同的 grep 行,我确实会看到该行始终被找到并且我得到 $? = 0
,所以我不确定问题出在哪里。
- run:
name: 'Start background services'
working_directory: services
background: true
command: docker-compose up
- run:
name: 'Build images for app'
working_directory: app
command: docker-compose build
- run:
name: 'Wait for services'
working_directory: services
command: |
until docker compose logs kafka | grep -q "started (kafka.server.KafkaServer)"; do
sleep 1
done
echo "Kafka is ready"
如果构建图像步骤需要 >= 1 分钟,我会在
until
循环中遇到错误,永远不会完成,而如果图像完全缓存,则循环工作正常。