GitHub仓库Docker容器运行状态检查及容器不存在报错解决
报错No such container: folder1的本质是传入的folder1是本地仓库的目录名,不是Docker环境中实际存在的容器名称。Docker不会自动将存放Dockerfile的文件夹名设置为容器名,容器名是容器启动时通过参数显式指定的,和本地目录结构没有默认绑定关系。
- 先确认容器真实名称
终端执行以下命令查看所有容器的真实名称,返回结果的NAMES列就是可用于脚本查询的合法容器名:
如果你是在仓库根目录用docker compose启动的服务,默认容器名规则为# 查看所有正在运行的容器 docker ps # 查看所有容器(含已停止的) docker ps -a[仓库根目录名]_[服务名]_1,比如my_repo下配置的folder1服务,默认容器名通常是my_repo_folder1_1,并非裸字符串folder1。 - 修正脚本逻辑
原脚本仅支持精确匹配完整容器名,且容器不存在时无有效返回值,可调整为支持关键词匹配,适配通过目录名关联对应容器的需求,修正后代码如下:
from typing import Optional, List
import docker
def is_container_running(container_keyword: str) -> Optional[bool]:
RUNNING = "running"
docker_client = docker.from_env()
all_containers: List = docker_client.containers.list(all=True)
matched_containers = [c for c in all_containers if container_keyword in c.name]
if not matched_containers: print(f"未找到名称包含{container_keyword}的容器,请先通过docker ps确认容器真实名称") return None if len(matched_containers) > 1: print(f"匹配到多个包含关键词{container_keyword}的容器:{[c.name for c in matched_containers]},默认取第一个匹配项判断状态") target_container = matched_containers[0] print(f"命中目标容器:{target_container.name}") return target_container.status == RUNNING
if name == "main":
container_keyword = "folder1"
result = is_container_running(container_keyword)
print(f"容器运行状态:{result}")
- (可选)强制容器名与目录名对齐 如果需要让每个目录对应的容器名和目录名完全一致,启动容器时显式指定名称即可: 直接用docker命令启动时,加`--name`参数: ```bash # 进入folder1目录构建完成后,启动时指定容器名为folder1 docker run -d --name folder1 自定义镜像名
用docker compose启动时,在对应服务的配置段下添加container_name: folder1字段,启动后容器名就会和目录名完全一致,原脚本传folder1即可精确匹配到目标容器。
内容的提问来源于stack exchange,提问作者user175025

