Bash中如何让docker启动mkdocs服务就绪后再执行浏览器打开命令
解决方法
你可以通过「后台启动容器 + 轮询检测服务就绪状态 + 切回前台进程」的逻辑实现需求,适配你当前的bash 3.2环境,完整脚本如下:
#!/bin/bash # 后台启动mkdocs容器,去掉-it参数避免后台运行时终端交互冲突 docker run --rm -p 8000:8000 -v "${PWD}:/docs" squidfunk/mkdocs-material & # 保存容器进程PID,用于后续等待操作 DOCKER_PID=$! # 轮询检测站点是否可用,最多等待30秒 for ((i=0; i<30; i++)); do # 检测8000端口是否可连通,macOS默认自带nc命令 nc -z 127.0.0.1 8000 >/dev/null 2>&1 if [ $? -eq 0 ]; then open http://localhost:8000 break fi sleep 1 done # 超时提示 if [ $i -eq 30 ]; then echo "服务启动超时,请检查容器是否正常运行" kill $DOCKER_PID exit 1 fi # 将容器进程切回前台,可正常使用Ctrl+C停止服务 wait $DOCKER_PID
优化说明
如果需要更精准的检测(避免端口通了但站点还未完成初始化的情况),可以将端口检测逻辑替换为HTTP状态码校验:
# 替换原来的nc检测部分 for ((i=0; i<30; i++)); do # 检测站点是否返回200状态码 curl -s -o /dev/null -w "%{http_code}" http://localhost:8000 | grep -q "200" if [ $? -eq 0 ]; then open http://localhost:8000 break fi sleep 1 done
内容的提问来源于stack exchange,提问作者Elye
相关产品推荐
相关产品推荐

