如何检查Docker端口/容器/镜像占用及脚本中判断MySQL容器存在性
Docker相关问题解决方案
一、检查特定端口、容器或镜像的使用状态
1. 检查特定端口是否被Docker容器占用
用docker ps过滤已发布的端口,有输出则说明端口被占用:
# 替换3306为目标端口 docker ps --filter "publish=3306" --format "{{.Names}}"
2. 检查容器是否存在/运行中
- 判断容器是否存在(无论运行状态):
执行后退出码为0则容器存在:# 替换<容器名/ID>为目标容器标识 docker inspect -f '{{.ID}}' <容器名/ID> >/dev/null 2>&1 - 判断容器是否处于运行状态:
有输出则容器正在运行:
或直接获取运行状态的布尔值:docker ps -q -f name=<容器名/ID>docker inspect -f '{{.State.Running}}' <容器名/ID>
3. 检查镜像是否存在/被使用
- 判断镜像是否存在:
退出码为0则镜像存在:docker image inspect <镜像名/ID> >/dev/null 2>&1 - 判断镜像是否被容器使用:
有输出则该镜像被至少一个容器引用:docker ps -a --filter ancestor=<镜像名/ID> --format "{{.Names}}"
二、Bash脚本中判断MySQL容器是否存在的解决方案
针对你的测试脚本,通过Docker命令的退出码实现布尔判断,同时修正脚本潜在问题,修改后的代码如下:
testAll () { dir=~/packages; # 停止所有包的容器 for f in "$dir"/* do cd "$f" || continue # 处理目录切换失败的情况 sail down; done; # 遍历执行测试 for f in "$dir"/* do cd "$f" || continue sail up -d; # 后台启动容器,避免阻塞脚本 # 检查MySQL容器是否运行 if docker-compose ps -q mysql > /dev/null 2>&1; then # 等待MySQL服务就绪(可选,防止迁移时连接失败) until docker-compose exec -T mysql mysql -uroot -p"${DB_PASSWORD:-password}" -e "SELECT 1" >/dev/null 2>&1; do sleep 2 done php artisan migrate:fresh --seed; fi test-all; sail down; done; cd ..; }
关键说明:
- 容器存在判断:
docker-compose ps -q mysql会输出MySQL容器ID(存在且运行时),重定向输出后,通过命令退出码判断——0表示容器存在,非0表示不存在。 - 后台启动容器:添加
-d参数让sail up后台运行,避免脚本阻塞。 - 等待MySQL就绪:新增循环确保MySQL服务完全启动后再执行迁移,避免连接失败。
- 目录容错:
|| continue保证目录切换失败时跳过后续步骤,避免报错。
内容的提问来源于stack exchange,提问作者Bulent
相关产品推荐
相关产品推荐

