使用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
相关产品推荐
相关产品推荐

