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

使用Python检查Docker容器运行状态的代码问题排查

无输出问题排查
  • 基础执行环境校验:在运行脚本的同个VS Code终端中,运行仅包含print("test")的简单Python脚本,确认Python解释器可正常输出,排除解释器选错、终端输出被拦截、脚本未实际执行的问题。
  • Docker权限与服务状态校验:同终端执行docker ps,若返回权限错误,执行sudo usermod -aG docker $USER后注销重登,让当前用户获取Docker访问权限;若命令无响应,先启动本机Docker服务。
  • SDK依赖校验:执行pip list | grep docker,若同时存在docker和docker-py包会出现调用冲突,执行pip uninstall -y docker-py && pip install --upgrade docker重装正确版本的官方SDK。
  • 容器名校验:执行docker ps -a --format "{{.Names}}"列出所有容器的精确名称,containers.get()方法仅支持精确名称匹配,不支持模糊/前缀匹配,若容器实际名称带自动生成的后缀(如myfolder1-abc123),传入myfolder1会触发容器不存在的错误。
修正后的可稳定运行代码
import docker
from docker.errors import NotFound, DockerException

RUNNING_STATUS = "running"
# 自动读取系统Docker配置,兼容多环境,无需硬编码套接字路径
docker_client = docker.from_env()

def is_container_running(container_name: str) -> bool:
    try:
        container = docker_client.containers.get(container_name)
        return container.status == RUNNING_STATUS
    except NotFound:
        print(f"检测失败:名称为[{container_name}]的容器不存在")
        return False
    except DockerException as e:
        print(f"连接Docker服务失败:{str(e)}")
        return False

if __name__ == "__main__":
    target_container = "myfolder1"
    print(f"容器[{target_container}]运行状态:{is_container_running(target_container)}")

代码改动说明:

  • 移除硬编码的Unix套接字地址,通过from_env()自动读取环境变量中的Docker连接配置,适配Windows、macOS、WSL2、Docker Desktop等不同部署环境
  • 新增全链路异常捕获,容器不存在、Docker连接异常时会输出明确错误信息,不会出现无报错无输出的静默问题
  • 直接使用SDK封装的status属性获取容器状态,避免手动读取底层attrs字段带来的版本兼容问题
  • 增加主入口判断,避免模块被其他代码导入时自动执行检测逻辑
其他实现方案参考
  • 方案1:调用Docker命令行实现,无需依赖Python SDK
    适合不想安装额外Python依赖的场景,通过subprocess调用原生Docker命令获取状态,稳定性更高:
    import subprocess
    
    def is_container_running_cli(container_name: str) -> bool:
        try:
            result = subprocess.run(
                ["docker", "inspect", "-f", "{{.State.Status}}", container_name],
                capture_output=True,
                text=True,
                check=True
            )
            return result.stdout.strip() == "running"
        except subprocess.CalledProcessError:
            # 容器不存在、Docker服务异常都会触发该错误
            return False
    
  • 方案2:按文件夹挂载路径批量匹配容器,无需硬编码容器名
    针对需要检测关联对应文件夹的共享容器的需求,可以直接遍历容器挂载点,按绑定的本地文件夹路径匹配目标容器,不用手动维护容器名列表:
    def get_running_containers_by_bind(local_folder_path: str) -> list[str]:
        matched_containers = []
        # 仅遍历运行中的容器,all=True则包含已停止的容器
        for container in docker_client.containers.list(all=False):
            for mount in container.attrs["Mounts"]:
                if mount.get("Source") == local_folder_path:
                    matched_containers.append(container.name)
        return matched_containers
    
    调用时传入本地文件夹的绝对路径,即可返回所有绑定该文件夹的运行中容器名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:24:32