
CLI开发工具【免费下载链接】cliThe Docker CLI项目地址https://gitcode.com/gh_mirrors/cli5/cli点击查看免费下载docker ps是 Docker CLI 中用于列出容器的核心命令也是日常排查容器状态、定位运行实例时使用频率最高的命令之一。本文基于当前仓库中docs/reference/commandline/ps.md的命令参考文档结合cli/command/container/list.go的实现源码与测试用例系统讲解docker ps的完整选项、过滤语法、Go 模板格式化能力及其底层调用链帮助你从会用进阶到用得精准。命令概览与别名docker ps用于列出容器其完整定义为 List containers。在 Docker CLI 的命令结构中该命令位于 container 子命令组下拥有四个等价别名docker container lsdocker container listdocker container psdocker ps在源码中newListCommand直接复用了newPsCommand构建的 Cobra 命令并为其挂上ps、list两个别名见 cli/command/container/list.go因此无论你习惯输入docker ps还是docker container ls得到的都是同一套参数与行为。docker ps不接受位置参数源码中通过Args: cli.NoArgs约束所有行为均由选项控制基本语法为docker ps [OPTIONS]选项总览以下为docker ps支持的全部选项来自 docs/reference/commandline/ps.md名称类型默认值说明-a,--allbool—显示所有容器默认仅显示运行中的容器-f,--filterfilter—按给定条件过滤输出--formatstring—使用自定义模板格式化输出table默认带表头的表格、table TEMPLATE按给定 Go 模板输出表格、jsonJSON 格式、TEMPLATE按给定 Go 模板输出。模板格式化的详细语法可参考 Docker 官方格式化文档-n,--lastint-1显示最近创建的 n 个容器包含所有状态-l,--latestbool—显示最近创建的 1 个容器包含所有状态--no-truncbool—不截断输出-q,--quietbool—仅显示容器 ID-s,--sizebool—显示容器总文件大小这些选项在 cli/command/container/list.go 中被逐一注册为 Cobra 标志其中--filter使用opts.FilterOpt类型支持重复传入多个过滤条件。默认输出行为不带任何选项运行时docker ps只显示运行中的容器。默认输出的列由源码中的defaultContainerTableFormat常量定义见 cli/command/formatter/container.gotable {{.ID}} {{.Image}} {{.Command}} {{.RunningFor}} {{.Status}} {{.Ports}} {{.Names}}即默认表格包含七列CONTAINER ID、IMAGE、COMMAND、CREATED、STATUS、PORTS、NAMES。若指定--size表格末尾会追加{{.Size}}列。几个值得注意的默认行为ID 截断默认情况下容器 ID 与镜像引用会被截断显示只有使用--no-trunc才展示完整 ID。这一逻辑位于 ContainerContext.ID()。PORTS 合并docker ps会把连续暴露的端口合并为一个区间例如同时暴露 TCP 端口100、101、102的容器会显示为100-102/tcp。NAMES 去斜杠容器名会去掉 API 返回的前导/前缀截断模式下只显示第一个主名称见 ContainerContext.Names()。对应的默认输出样式可参考测试基准文件 cli/command/container/testdata/container-list-without-format.golden。常用选项详解显示所有容器-a, --alldocker ps默认只列出运行中的容器。要看到包括已停止、已退出在内的所有容器使用-a或--all$ docker ps -a不截断输出--no-trunc使用--no-trunc显示完整的容器 ID 与完整命令适合需要精确引用容器 ID 或查看完整启动命令的场景$ docker ps --no-trunc CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca5534a51dd04bbcebe9b23ba05f389466cf0c190f1f8f182d7eea92a9671d00 ubuntu:24.04 bash 17 seconds ago Up 16 seconds 3300-3310/tcp webapp 9ca9747b233100676a48cc7806131586213fa5dab86dd1972d6a8732e3a84a4d crosbymichael/redis:latest /redis-server --dir 33 minutes ago Up 33 minutes 6379/tcp redis,webapp/db从源码看--no-trunc通过Trunc: !options.noTrunc传入格式化上下文见 cli/command/container/list.go决定 ID、镜像、命令等字段是否被截断。显示磁盘占用-s, --size--size或-s会为每个容器显示两种磁盘占用信息$ docker ps --size CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE e90b8831a4b8 nginx /bin/bash -c mkdir 11 weeks ago Up 4 hours my_nginx 35.58 kB (virtual 109.2 MB) 00c6131c5e30 telegraf:1.5 /entrypoint.sh 11 weeks ago Up 11 weeks my_telegraf 0 B (virtual 209.5 MB)size可写层大小容器可写层在磁盘上实际占用的数据量virtual size虚拟大小容器使用的只读镜像数据与可写层合计的磁盘占用。该字段由 ContainerContext.Size() 渲染格式为35.58 kB (virtual 109.2 MB)。由于计算容器大小是相对昂贵的操作CLI 默认不会请求该数据——这一点在下面的格式化与源码实现章节会进一步展开。仅显示容器 ID-q, --quiet-q/--quiet只输出容器 ID 列表非常适合配合xargs等工具做批量操作$ docker ps -q a87ecb4f327c 01946d9d34d8在源码中quiet 模式会切换到DefaultQuietFormat见 NewContainerFormat()。最近创建的容器-n, --last / -l, --latest-n, --last n显示最近创建的 n 个容器包含所有状态默认值-1表示不限制数量-l, --latest显示最近创建的 1 个容器包含所有状态。两者的实现都映射到底层 API 的Limit参数。在 buildContainerListOptions() 中--last的值直接作为Limit若指定了--latest且未显式设置--lastlast -1则Limit被强制为1。对应测试见 cli/command/container/list_test.go。过滤输出--filter / -f--filter短选项-f的格式为keyvalue键值对有多个过滤条件时重复传入多个--filter标志例如--filter foobar --filter bifbaz。过滤器同样会原样传递到底层 API 的Filters字段见 cli/command/container/list.go因此过滤能力与 Docker Engine API 保持一致。docker ps当前支持的过滤器如下过滤器说明id容器 IDname容器名称label任意字符串表示标签键或键值对写作key或keyvalueexited表示容器退出码的整数仅在配合--all时有意义status取值为created、restarting、running、removing、paused、exited或dead之一ancestor过滤共享某个镜像作为祖先的容器可写image-name[:tag]、image id或imagedigestbefore/since过滤在指定容器ID 或名称之前/之后创建的容器volume过滤挂载了指定卷或绑定挂载的容器network过滤连接到指定网络的容器publish/expose过滤发布或暴露指定端口的容器写作port[/proto]或startport-endport/[proto]health按健康检查状态过滤取值为starting、healthy、unhealthy或noneisolation仅 Windows 守护进程支持取值为default、process或hypervis-task过滤作为服务任务的容器布尔值true或false按标签过滤labellabel过滤器只匹配存在该标签的容器而不关心标签值$ docker ps --filter labelcolor CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 673394ef1d4c busybox top 47 seconds ago Up 45 seconds nostalgic_shockley d85756f57265 busybox top 52 seconds ago Up 51 seconds high_albattani也可同时匹配标签键与标签值$ docker ps --filter labelcolorblue CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d85756f57265 busybox top About a minute ago Up About a minute high_albattani按名称过滤namename过滤器匹配名称的全部或部分内容子串匹配$ docker ps --filter namenostalgic_stallman $ docker ps --filter namenostalgic # 子串匹配可命中多个容器按退出码过滤exitedexited过滤器按退出码匹配容器通常需要配合-a才能看到已退出的容器$ docker ps -a --filter exited0一个常见的排查场景是定位被SIGKILL信号 9杀死的容器其退出码为137$ docker ps -a --filter exited137导致退出码137的常见原因包括容器内init进程被手动杀死、docker kill杀死容器、Docker 守护进程重启时杀掉了所有运行中的容器。按状态过滤statusstatus过滤器支持的状态及其含义状态说明created从未启动过的容器running由docker start或docker run启动、正在运行的容器paused已暂停的容器参见docker pauserestarting因容器的重启策略而正在启动的容器exited不再运行的容器进程已完成或被docker stop停止removing正在被移除过程中的容器参见docker rmdead僵死容器例如因外部进程占用资源而只被部分移除的容器dead容器无法重新启动只能移除示例$ docker ps --filter statusrunning $ docker ps --filter statuspaused按镜像祖先过滤ancestorancestor过滤器匹配使用指定镜像或其子镜像的容器支持以下镜像表示形式imageimage:tagimage:tagdigestshort-idfull-id未指定tag时默认使用latest。例如过滤所有使用ubuntu镜像的容器$ docker ps --filter ancestorubuntu也可以按镜像 ID 对应的层如d0e008c6cf02过滤出所有在其层栈中包含该层的容器$ docker ps --filter ancestord0e008c6cf02按创建时间过滤before / sincebefore只显示在指定容器ID 或名称之前创建的容器$ docker ps -f before9c3527ed70cesince只显示在指定容器之后创建的容器$ docker ps -f since6e63f6ff38b0按卷过滤volumevolume过滤器匹配挂载了指定卷名或指定挂载路径的容器可与--format组合查看挂载详情$ docker ps --filter volumeremote-volume --format table {{.ID}}\t{{.Mounts}} $ docker ps --filter volume/data --format table {{.ID}}\t{{.Mounts}}按网络过滤networknetwork过滤器同时支持网络名称和网络ID$ docker run -d --netnet1 --nametest1 ubuntu top $ docker run -d --netnet2 --nametest2 ubuntu top $ docker ps --filter networknet1使用网络 ID 过滤时可先通过docker network inspect --format {{.ID}} net1取得完整 ID 再传入。按端口过滤publish / exposepublish与expose过滤器匹配发布或暴露了指定端口、端口区间及协议的容器未指定协议时默认为tcp$ docker ps --filter publish80 # 发布端口 80 的容器 $ docker ps --filter expose8000-8080/tcp # 暴露 8000-8080 TCP 端口的容器 $ docker ps --filter publish80/udp # 发布 UDP 端口 80 的容器自定义输出格式--format--format使用 Go 模板语法对输出做精细控制支持四种形式table带列头的表格默认table TEMPLATE使用给定 Go 模板并以表格带列头形式输出json以 JSON 格式输出每行一个容器对象TEMPLATE仅按给定 Go 模板输出不带列头模板占位符模板中可用的占位符如下占位符说明.ID容器 ID.Image镜像 ID.Command带引号的启动命令.CreatedAt容器创建时间.RunningFor容器启动至今的时长.Ports暴露的端口.State容器状态如created、running、exited.Status带时长与健康信息的容器状态.HealthStatus容器健康状态starting、healthy、unhealthy不可用时为空.Size容器磁盘大小.Names容器名称.Labels分配给容器的全部标签.Label指定标签的值例如{{.Label com.docker.swarm.cpu}}.Mounts容器中挂载的卷名称.Networks容器连接的网络名称这些占位符与 ContainerContext 中定义的字段及表头一一对应。典型用法示例不带表头输出由冒号分隔的 ID 与命令$ docker ps --format {{.ID}}: {{.Command}} a87ecb4f327c: /bin/sh -c #(nop) MA 01946d9d34d8: /bin/sh -c #(nop) MA c1d3b0166030: /bin/sh -c yum -y up 41d50ecd2f57: /bin/sh -c #(nop) MA以表格形式列出所有运行容器的 ID 与标签$ docker ps --format table {{.ID}}\t{{.Labels}} CONTAINER ID LABELS a87ecb4f327c com.docker.swarm.nodeubuntu,com.docker.swarm.storagessd 01946d9d34d8 c1d3b0166030 com.docker.swarm.nodedebian,com.docker.swarm.cpu6 41d50ecd2f57 com.docker.swarm.nodefedora,com.docker.swarm.cpu3,com.docker.swarm.storagessd以 JSON 格式输出便于程序化解析$ docker ps --format json {Command:\/docker-entrypoint.…\,CreatedAt:2021-03-10 00:15:05 0100 CET,ID:a762a2b37a1d,Image:nginx,Labels:maintainerNGINX Docker Maintainers \u003cdocker-maintnginx.com\u003e,LocalVolumes:0,Mounts:,Names:boring_keldysh,Networks:bridge,Ports:80/tcp,RunningFor:4 seconds ago,Size:0B,State:running,Status:Up 3 seconds}源码实现docker ps 的底层调用链理解docker ps的实现有助于预判其行为。核心流程位于 cli/command/container/list.go 的runPs函数大致分四步确定格式来源若命令行未传--format则回退读取 CLI 配置文件~/.docker/config.json中的psFormat字段PsFormat的定义见 cli/config/configfile/file.go。若同时传了--format和--quiet则会向 stderr 输出警告WARNING: Ignoring custom format, because both --format and --quiet are set.。构造 API 请求参数buildContainerListOptions将 CLI 选项映射为client.ContainerListOptionsAll、Limit、Size、Filters。调用引擎 API通过dockerCLI.Client().ContainerList(ctx, listOptions)获取容器列表。格式化渲染构造formatter.Context后由formatter.ContainerWrite统一渲染见 cli/command/formatter/container.go。模板预校验与 Size 自动探测buildContainerListOptions中有一段值得注意的优化逻辑见 cli/command/container/list.go当指定了--format时CLI 会先解析并执行模板做两件事预校验模板合法性模板解析或执行失败会立即报错避免把错误模板发给守护进程后才发现问题自动启用--size因为请求容器大小是昂贵的操作CLI 默认不请求该数据。但如果模板中使用了.Size字段ContainerContext会通过FieldsUsed机制记录下来CLI 据此自动把Size置为true见 cli/command/formatter/container.go。当然显式传入--sizefalse可以强制关闭这一自动行为。这一行为在 cli/command/container/list_test.go 的TestContainerListFormatSizeSetsOption中有完整覆盖模板含.Size时自动开启仅含.Names时保持关闭--sizefalse可覆盖自动探测。错误处理与边界情况测试用例cli/command/container/list_test.go验证了以下错误场景模板中引用了未定义的函数如{{invalid}}会报错function invalid not defined模板函数参数个数错误如{{join}}会报错wrong number of args for join底层 API 调用失败时错误会原样透出。此外docker ps的格式化输出对容器名含/的情况做了特殊处理截断模式下只选取第一个非 legacy link 的名称如foo/bar只显示foo该场景同样有对应测试cli/command/container/list_test.go。通过配置文件自定义默认格式如果你希望docker ps每次都以自定义模板输出而无需反复输入--format可以在~/.docker/config.json中设置psFormat{ psFormat: table {{.Names}}\t{{.Image}}\t{{.Labels}}\t{{.Size}} }配置生效后未显式指定--format的docker ps调用都会使用该模板。对应测试见 cli/command/container/list_test.go。常见组合实战最后汇总几个高频实战组合# 查看所有容器含已停止仅输出 ID便于批量操作 docker ps -aq # 按标签定位业务容器 docker ps --filter labelprojectweb # 找出最近启动失败的容器 docker ps -a --filter exited1 --filter statusexited # 列出容器并同时展示挂载卷与磁盘大小 docker ps -as --format table {{.ID}}\t{{.Names}}\t{{.Mounts}}\t{{.Size}} # 以 JSON 输出容器列表供脚本消费 docker ps --format json # 只查看最近创建的 5 个容器包含所有状态 docker ps -n 5掌握docker ps的选项、过滤器与模板语法可以让你在容器数量众多的环境中快速定位目标容器并将输出无缝接入自动化脚本。需要查阅更多细节时可回到命令参考文档 docs/reference/commandline/ps.md 或同源扩展文档 docs/reference/commandline/container_ls.md。赞分享CLI开发工具【免费下载链接】cliThe Docker CLI项目地址https://gitcode.com/gh_mirrors/cli5/cli点击查看免费下载相关推荐BaiduPCS-Go 完整指南4个场景玩转百度网盘命令行管理BaiduPCS Go 完整指南4个场景玩转百度网盘命令行管理 BaiduPCS Go 是一款用 Go 语言编写的百度网盘命令行客户端加强版在原版基础上加入CLI开发工具Salt Player 本地音乐播放器完整指南10 分钟从下载到离线播放Android Windows 双端Salt Player 本地音乐播放器完整指南10 分钟从下载到离线播放Android Windows 双端 Salt Player椒盐音乐是一款CLI开发工具Docker CLI volume ls列表、过滤与模板格式化卷输出的完整指南Docker CLI volume ls列表、过滤与模板格式化卷输出的完整指南 本文基于 Docker CLIcli 仓库中 docker volumeCLI开发工具上一篇RPFM RON Schema体系完整指南声明式配置如何驱动总战争DB表格类型系统下一篇PPT Master 动画与切换完全教程203 种原生动画 48 种切换让 PPT 真正动起来创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考