You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查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 ..;
}

关键说明:

  1. 容器存在判断:docker-compose ps -q mysql会输出MySQL容器ID(存在且运行时),重定向输出后,通过命令退出码判断——0表示容器存在,非0表示不存在。
  2. 后台启动容器:添加-d参数让sail up后台运行,避免脚本阻塞。
  3. 等待MySQL就绪:新增循环确保MySQL服务完全启动后再执行迁移,避免连接失败。
  4. 目录容错:|| continue保证目录切换失败时跳过后续步骤,避免报错。

内容的提问来源于stack exchange,提问作者Bulent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:27:45