如何判断容器是通过docker run还是docker-compose up启动的?
容器编排来源与重启规则判断方案
该需求完全可以实现,不需要额外安装工具,通过Docker原生命令即可完成判断,同时可以直接确认容器的自动重启规则、对应配置文件存放位置。
前置通用检查:先确认容器自身的重启策略
不管容器通过什么方式启动,首先可以直接查询容器级别的重启配置,命令如下:
docker inspect <容器ID或容器名> --format '{{.HostConfig.RestartPolicy.Name}}'
命令返回值对应规则:
no:默认配置,容器退出后不会自动重启on-failure:仅当容器以非0状态码退出时才会触发重启,可配置最大重启次数always:无论容器因何种原因退出,都会自动重启;Docker守护进程启动时,无论容器当时是什么状态都会被自动拉起unless-stopped:逻辑和always基本一致,区别是如果容器被手动执行stop操作停止,Docker守护进程重启时不会自动拉起该容器
注意:该配置是容器维度的基础规则,上层编排工具可能会覆盖或补充额外的调度重启逻辑,不能单独用这个结果判断编排来源。
分场景判断容器编排来源
1. 手动docker run启动的容器
判断特征:查询容器标签时,不存在任何编排工具专属的内置标签。查询标签命令:
docker inspect <容器ID或容器名> --format '{{json .Config.Labels}}'
如果返回结果里没有compose、swarm、k8s、容器管理平台相关的固定标签,即可判定为手动docker run启动。
- 自动重启逻辑:完全由启动时传入的
--restart参数决定,没有上层调度逻辑 - 配置文件位置:系统不会自动留存这类容器的声明式配置,启动参数只能通过
docker inspect结果回溯,若启动者没有手动保存启动脚本/命令,没有固定路径的配置文件可查。
2. docker-compose启动的容器
判断特征:容器会被自动注入一组compose专属固定标签,执行以下命令如果返回非空项目名,即可判定为compose启动:
docker inspect <容器ID或容器名> --format '{{index .Config.Labels "com.docker.compose.project"}}'
可直接通过标签查询到需要的配置位置:
- 查compose文件所在工作目录:
docker inspect <容器ID或容器名> --format '{{index .Config.Labels "com.docker.compose.project.working_dir"}}' - 查启动时使用的compose配置文件全路径:
docker inspect <容器ID或容器名> --format '{{index .Config.Labels "com.docker.compose.project.config_files"}}' - 自动重启逻辑:首先遵循容器维度的restart配置,只要没有执行
docker compose down删除项目资源,异常退出的容器会被自动拉起;如果执行了down操作,项目对应所有容器、网络都会被移除,不会自动重启。
3. 其他编排系统启动的容器
同样通过专属内置标签判断即可,常见场景如下:
- Docker Swarm编排的容器:存在
com.docker.swarm.service.id、com.docker.swarm.task.id标签。这类容器由Swarm控制器调度,只要服务配置的副本数不为0,容器故障下线后会被自动在集群节点上重新拉起;配置存放在Swarm的内置raft存储中,节点本地没有固定路径的声明式配置文件,需要通过docker service inspect <服务名>查询配置。 - Kubernetes编排的容器:存在
io.kubernetes.pod.name、io.kubernetes.container.name标签。这类容器的重启逻辑由Pod的restartPolicy字段决定,由节点上的kubelet负责拉起;配置存放在集群的etcd存储中,节点本地不会留存Pod的声明式配置,需要通过kubectl查询对应资源定义。 - 第三方容器管理平台(Portainer、Rancher等)启动的容器:会带有对应平台的专属标签(比如Portainer启动的容器带
io.portainer.*前缀标签),自动重启逻辑由对应平台的调度规则决定,配置存放在平台的后台存储中,可通过平台UI查询对应配置路径。
特殊说明:如果手动执行
docker run时恶意伪造了编排工具的专属标签,会导致判断结果偏差,这类场景在生产环境几乎不会出现,标签判断法的实际准确率可以达到99%以上。
内容的提问来源于stack exchange,提问作者estani
相关产品推荐
相关产品推荐

