Docker Compose中wait-for脚本未生效,如何查看日志验证脚本运行状态?
排查Wait-For脚本运行状态与日志查看方法
首先,咱们先解决日志查看的问题,这样能直接看到脚本有没有在执行、执行过程中出了什么问题:
1. 查看App2容器的日志
- 如果你想查看容器的历史日志,直接运行:
docker logs y2 - 如果想要实时追踪日志(比如脚本正在循环等待时),加上
-f参数:docker logs -f y2 - 也可以用Docker Compose的专属命令查看服务日志,更贴合你的配置场景:
这个命令会拉取app2服务从启动以来的所有日志,包括启动失败的情况。docker-compose logs app2
2. 给脚本加更详细的调试输出
如果默认日志信息不够,你可以修改自己的wait-for脚本,添加更细节的调试内容,比如在循环里打印当前检查的容器状态:
#!/bin/bash container_name="$1" c=1 until docker container ls --filter "name=$container_name" --filter "status=running" | grep healthy; do >&2 echo "[$(date)] Server $container_name is unavailable - sleeping" # 新增:打印当前容器的实际状态,方便排查 >&2 echo "[$(date)] Current container status: $(docker container ls --filter "name=$container_name" --format "{{.Names}} {{.Status}}")" sleep 5 ((c=c+1)) >&2 echo "[$(date)] Retry count: $c" if [[ "$c" -eq 20 ]] ;then >&2 echo "[$(date)] Max retries reached, exiting" exit 1; fi done >&2 echo "[$(date)] Server $container_name is healthy, proceeding!"
修改后重新启动容器,日志里会清晰显示每一步的检查结果,帮你确定脚本是否在正常执行。
3. 额外排查点:脚本是否被正确执行
从你的docker-compose.yml来看,app2的command写的是./wait-for-it.sh,但你自己编写的脚本叫wait-for——这里是不是文件名写错了?如果容器里找不到指定的脚本,会直接报错退出,自然看不到等待状态。你需要把command改成./wait-for,同时确保这个脚本已经被复制到app2的镜像里,或者用volume挂载进去。
另外,你的脚本是检查容器的healthy状态,但app1服务没有配置healthcheck,Docker永远不会标记它为healthy,脚本会一直重试到超时退出。你需要给app1添加健康检查配置,比如(根据app1的实际服务调整检查命令):
app1: image: x container_name: "xx" restart: always ports: - 222 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:222"] # 示例:检查222端口的HTTP服务 interval: 5s timeout: 5s retries: 5 networks: - x_network
4. 验证脚本进程是否在运行
如果容器还在运行,你可以进入容器查看进程列表,确认脚本是否在执行:
docker exec -it y2 ps aux
如果能看到wait-for脚本的进程,说明它正在运行;如果看不到,可能是脚本已经退出或者没被正确启动。
内容的提问来源于stack exchange,提问作者user63898
相关产品推荐
相关产品推荐

