Moby: 默认的“docker ps”输出太宽

创建于 2014-08-08  ·  83评论  ·  资料来源: moby/moby

screenshot 2014-08-07 16 27 38

docker ps输出在 80 个字符宽的终端上很难阅读。

/bin/ps在窄终端上包装输出方面做得非常好(例如,将重要信息放在首位,命令放在最后并截断它)。 我想知道我们是否可以做得更好。

arecli exbeginner kinenhancement kinfeature

最有用的评论

用管道连接到寻呼机有什么问题?

docker ps | less -S

所有83条评论

如此多的爱和许多+1。 我使用 80x24 终端(令
我的同事),这个对我来说是一个小刺激
时间。

我不得不说这也经常让我着迷。

任何解决方案的想法? 在较窄的终端上安装较小的版本听起来不错。

嗯,ID 并不真的需要在那里。

这个怎么样:

NAME               IMAGE              STATUS      PORTS             COMMAND
prickly_perlman    ubuntu:14.04       Up 15s      8000->8000/tcp    sleep 30000

解释:

  • 没有 ID,因为容器总是有名字
  • 没有创建,你可以检查一下
  • 了解所有打开的端口的概述似乎非常有用,但也许这可能会被删除?
  • 命令可以被截断为终端的宽度,例如/bin/ps

@bfirsh :thumbsup:

  • 请不要丢弃端口,对我来说,它们对于快速查看哪些端口连接到哪个容器非常有用。 必须检查每个容器很麻烦
  • --no-trunc怎么办,现在容器 ID 不再可见? 存在许多依赖此功能来清除已停止容器的示例
  • (默认)排序顺序是什么? 创建日期(不合逻辑,因为该列不再可见)? 按字母顺序排列容器名称?
  • 为了将来的改进; 允许指定要显示和排序的列(例如--columns=a,f,g --sort=a,e
  • 为了将来的改进; 使列显示和排序在配置文件中可配置
  • 为了将来的改进; 允许设置默认过滤器选项(默认情况下做/不显示停止的容器( -a ))

用管道连接到寻呼机有什么问题?

docker ps | less -S

@benjamin-thomas 或docker ps默认检测 TTY 并通过管道连接到less -S

不错的技巧@benjamin-thomas,我将来肯定会使用它。 一个考虑因素是它确实忽略了我关心的信息,最重要的是容器名称。 而在我的用例中,我通常不太关心例如CREATEDSTATUS

IMO 的用例可能因用户而异,对我来说, STATUS _is_ 很重要,可以快速检查我的容器是否仍然运行良好或发出“whoopsie”。

我不确定这是否应该成为 ps 输出的大型重新实现,或者 _start_ 在默认情况下使其更清洁并以此为基础,通过添加选项来指定要显示的列、排序顺序使其更易于配置和过滤。

@nathanleclaire ,一旦您进入less ,只需使用箭头键,您就可以访问全部内容。 还是我误会你了?

@grahamc为什么不呢,我个人更喜欢不自动做这些事情的工具。 如果需要的话,总是可以为这个 IMO 定义一个 shell 别名。

@thaJeztah用开关指定列名对我来说很有意义,比如系统 ps 命令/bin/ps -o pid,ruser=RealUser -o comm=Command

@benjamin-thomas 哦,我什至没有意识到这一点。 好的! 我非常喜欢这个解决方案。

@benjamin-thomas /bin/ps自动执行此操作。 如果你想禁用它,你可以通过cat或其他任何方式来管道它。

docker ps输出的宽度相关:是否真的有必要将到给定容器的每个可能的链接链都视为该容器的新名称? 例如,如果我有五个容器名为 A、B、C、D 和 E,并且 A 链接到 B,B 链接到 C,等等,那么 E 将有五个不同的名称:E、D/E、C/ D/E、B/C/D/E 和 A/B/C/D/E。

然后,如果 B 也链接到 D,E 会得到更多的名称:B/D/E 和 A/B/D/E。 我正在处理的系统的一次运行启动了 17 个容器——由于 31 个依赖关系,这些容器总共有 _387 个名称_。 无论我的终端窗口有多宽,如果没有寻呼机, docker ps的输出都是不可读的。 名称的数量在容器数量中_比二次方_更差真的有意义吗? 如果有一种方法可以禁用这种迂腐的枚举级别,那至少会很好。

@mraccident :+1: docker ps应该只显示主名称,而不是该容器的所有名称

Salut,这也困扰着我,我只是在 docker 中添加了一个“--short”选项。 保持完整的端口列。
https://github.com/ChristianKniep/docker/tree/7477-short_ps

$ docker run --name fd1 -d -p 80 -p 22 -p 53 fedora sleep 600
af6599f9b1178b237f6c2524f14cada45a46b234168e5270b99b16d1ce0be295
$ docker run --name fd2 --link fd1:fd1  -d -p 80 -p 22 -p 53 fedora sleep 600
ec2b2afc72dae7e62b197dc5adbcdeb548435ac495b8c935c728eb7aff658004
$ docker run --name fd3 --link fd2:fd2  --link fd1:fd1  -d -p 80 -p 22 -p 53 fedora sleep 600
ac57921063cc6afbe1cf715872dc33df45147ef1f464859c0912261b88e6bb4b
$ docker ps
CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS              PORTS                                                                 NAMES
ac57921063cc        fedora:latest   sleep 600           3 seconds ago       Up 2 seconds        0.0.0.0:49159->22/tcp, 0.0.0.0:49160->53/tcp, 0.0.0.0:49161->80/tcp   fd3                               
ec2b2afc72da        fedora:latest   sleep 600           11 seconds ago      Up 10 seconds       0.0.0.0:49156->22/tcp, 0.0.0.0:49157->53/tcp, 0.0.0.0:49158->80/tcp   fd2,fd3/fd2                       
af6599f9b117        fedora:latest   sleep 600           31 seconds ago      Up 30 seconds       0.0.0.0:49153->22/tcp, 0.0.0.0:49154->53/tcp, 0.0.0.0:49155->80/tcp   fd1,fd2/fd1,fd3/fd1,fd3/fd2/fd1                    
$ ./docker-1.1.2-dev ps -S
CONTAINER ID        IMAGE                       PORTS                                                                 NAMES
ac57921063cc        fedora:latest   0.0.0.0:49159->22/tcp, 0.0.0.0:49160->53/tcp, 0.0.0.0:49161->80/tcp   fd3                               
ec2b2afc72da        fedora:latest   0.0.0.0:49156->22/tcp, 0.0.0.0:49157->53/tcp, 0.0.0.0:49158->80/tcp   fd2,fd3/fd2                       
af6599f9b117        fedora:latest   0.0.0.0:49153->22/tcp, 0.0.0.0:49154->53/tcp, 0.0.0.0:49155->80/tcp   fd1,fd2/fd1,fd3/fd1,fd3/fd2/fd1             
$ ./docker-1.1.2-dev ps -h

Usage: docker ps [OPTIONS]

List containers

  -a, --all=false       Show all containers. Only running containers are shown by default.
  --before=""           Show only container created before Id or Name, include non-running ones.
  -f, --filter=[]       Provide filter values. Valid filters:
                          exited=<int> - containers with exit code of <int>
  -l, --latest=false    Show only the latest created container, include non-running ones.
  -n=-1                 Show n last created containers, include non-running ones.
  --no-trunc=false      Don't truncate output
  -q, --quiet=false     Only display numeric IDs
  -S, --short=false     Skip command created and status
  -s, --size=false      Display sizes
  --since=""            Show only containers created since Id or Name, include non-running ones.
$

由于我是新手,我想我的代码可能会......优化......
但令人惊讶的是,作为一个长达一年的 python 人,更改代码是多么容易。 我喜欢!

编辑:也许可以获取终端的大小并踢出列以缩短行...

EDIT2:我缩短了名称并添加了一个计数(儿童),即使它有点误导,因为它也计算 fd3->fd2->fd1。

$ ~/bin/docker-1.1.2-dev ps -S
CONTAINER ID        IMAGE                       PORTS                                                                 NAME                #CHILDREN
9b382826657c        fedora:latest   0.0.0.0:49168->22/tcp, 0.0.0.0:49169->53/tcp, 0.0.0.0:49170->80/tcp   fd3                 0
93f5a7b13d8b        fedora:latest   0.0.0.0:49165->22/tcp, 0.0.0.0:49166->53/tcp, 0.0.0.0:49167->80/tcp   fd2                 1
4c6f3564612c        fedora:latest   0.0.0.0:49162->80/tcp, 0.0.0.0:49163->22/tcp, 0.0.0.0:49164->53/tcp   fd1                 3

EDIT3:现在我提取正确的名称

$ ./docker-1.1.2-dev ps -S
CONTAINER ID        IMAGE                       PORTS                                                                 NAME                #LINKS
71d9d03bba50        fedora:latest   0.0.0.0:49177->22/tcp, 0.0.0.0:49178->53/tcp, 0.0.0.0:49179->80/tcp   fd3                 0
cf67008f418f        fedora:latest   0.0.0.0:49174->22/tcp, 0.0.0.0:49175->53/tcp, 0.0.0.0:49176->80/tcp   fd2                 1
5549c65007b5        fedora:latest   0.0.0.0:49171->22/tcp, 0.0.0.0:49172->53/tcp, 0.0.0.0:49173->80/tcp   fd1                 3

我觉得端口定义和时代的冗长是docker ps输出宽度的很大一部分。 我认为缩短时间并将端口定义换行会节省大量空间(除了允许我选择/隐藏列之外)。

CONTAINER ID     IMAGE                 COMMAND                CREATED     STATUS              PORTS                            NAMES
8a2e6a22ae1f     me/abc-data:latest    "/bin/sh -c bash"      6 sec       Exited (0) 6 sec                                     app-without-ports
749ed051fb73     me/webserver:latest   "/opt/server/run.sh"   4 days      Up 4 days           0.0.0.0:8080->8080/tcp,          my-webserver
                                                                                              192.168.1.1:9990->9990/tcp      
2eb3c43af24f     me/app:latest         "/opt/container-star   8 days      Up 8 days           0.0.0.0:1234->1234/tcp,          some-other-app
                                                                                              0.0.0.0:4567->4567/tcp, 
                                                                                              0.0.0.0:50000->50000/tcp, 
                                                                                              0.0.0.0:50000->50000/udp  

例如,通过使用columname:width :modifier、 columname:width :modifier 设置环境变量DOCKER_PS_FORMAT来允许提供模板怎么样?
其中modifier可能允许其他设置,例如no-truncfull (例如用于容器 ID)或short for CREATED where ~1h可以是About an hour ago的简写形式。

我在~/.bashrc编写了这个 bash/zsh 函数以更好地显示docker ps ,您可以隐藏或重新排序列:

dps()  {
  docker ps $@ | awk '
  NR==1{
    FIRSTLINEWIDTH=length($0)
    IDPOS=index($0,"CONTAINER ID");
    IMAGEPOS=index($0,"IMAGE");
    COMMANDPOS=index($0,"COMMAND");
    CREATEDPOS=index($0,"CREATED");
    STATUSPOS=index($0,"STATUS");
    PORTSPOS=index($0,"PORTS");
    NAMESPOS=index($0,"NAMES");
    UPDATECOL();
  }
  function UPDATECOL () {
    ID=substr($0,IDPOS,IMAGEPOS-IDPOS-1);
    IMAGE=substr($0,IMAGEPOS,COMMANDPOS-IMAGEPOS-1);
    COMMAND=substr($0,COMMANDPOS,CREATEDPOS-COMMANDPOS-1);
    CREATED=substr($0,CREATEDPOS,STATUSPOS-CREATEDPOS-1);
    STATUS=substr($0,STATUSPOS,PORTSPOS-STATUSPOS-1);
    PORTS=substr($0,PORTSPOS,NAMESPOS-PORTSPOS-1);
    NAMES=substr($0, NAMESPOS);
  }
  function PRINT () {
    print ID NAMES IMAGE STATUS CREATED COMMAND PORTS;
  }
  NR==2{
    NAMES=sprintf("%s%*s",NAMES,length($0)-FIRSTLINEWIDTH,"");
    PRINT();
  }
  NR>1{
    UPDATECOL();
    PRINT();
  }' | less -FSX;
}
dpsa() { dps -a $@; }

解决方法黑客。 根据需要修改要保留的 $cols[x]。

docker ps | perl -ne '<strong i="6">@cols</strong> = split /\s{2,}/, $_; printf "%30s %20s %20s\n", $cols[1], $cols[3], $cols[4]'

拥有类似的东西不是更容易:

$ docker ps --columns=name,id,status,image

每个人都可以别名docker ps

谢谢@caiguanhao。 聪明的临时解决方案。 将其添加为鱼壳的 Tackle 插件

伙计们,刚刚对@caiguanhao的代码进行了小改进,以便能够选择要显示的列。 当你有一个暴露许多端口的容器(比如 Consul 服务,它暴露 5 或 6 个端口,甚至可以使 300 个字符宽的屏幕溢出),有一个命令来显示除这些端口之外的每一列是很好的,并且然后另一个只显示容器名称及其端口(我默认将这些选项添加为新命令):

https://github.com/jpmelos/dotfiles/commit/457a9c68f87eb5bd455aa22bdadab81c2651c2ea

一个有一点帮助的简单更改是减少 CONTAINER ID 和 IMAGE 列之间的间距。 其他列都用 3 个空格隔开,但这两个是用 8 隔开的。

我的 5 美分,直到他们使 'docker ps' 可读:

https://github.com/t0mk/dosk#dops

我们会看到任何更新吗?
docker ps是我认为最常见的命令。 我希望为我们提供过滤要显示的列的选项并不难。
(我期望像

迪布斯

就像@AntouanK说的和@wpp已经建议的那样,在大多数情况下,列标志是首选

我认为#10255 应该解决这个问题。

@duglin这是否会使默认值更短? 如果没有,我想保持开放。

@bfirsh好点,不,它不会改变默认值。 但是我不确定我们是否可以在 v2 之前更改默认值(如果/何时),因为如果我们这样做了,我们会破坏现有的客户端。

同样在这里。 也许一些智能机制通过将阈值应用于 ENV['COLUMNS'] 来选择显示的默认列?

我同意https://github.com/docker/docker/issues/7477#issuecomment -70243594,只需给我们选择列的选项即可。

我也投票支持https://github.com/docker/docker/issues/7477#issuecomment -70243594 选项。
docker ps将是docker ps --columns=id,image,command,created,status,ports,name并且可以很容易地实现更多列,例如ip一些用户想要https://github.com/docker/docker/issues/8786

+1 为 --columns

作为一种解决方法,我将docker ps -qdocker inspect --format

docker ps -q | xargs docker inspect --format '{{printf "%.12s\t%s" .Id .Config.Cmd}}'

您必须深入研究 docker inspect 和 golang 模板的输出,但它几乎是无限可配置的。

@jafcrocker不错。 也许我们可以制定一个公开的要点来保留一系列像这样的解决方法? 直到我们得到一些标志来正确地自定义输出......

我们刚刚合并了 #14699,它允许您运行docker ps --format ...来更改 ps 输出。 如果需要,您还可以设置默认格式,请查看此屏幕截图:

image

我将按已修复的方式关闭此问题。 请随时尝试一下,让我们知道您的想法。

对于那些想要尝试的人,可以在https://master.dockerproject.org找到“主”构建,这个功能应该很快就会出现(如果还没有的话)

虽然--format是一个非常好的补充,但我认为这并不能解决主要问题。 我每天使用的几乎所有命令行工具都能正确处理可变大小的终端。 大多数通过查看$COLUMNS环境变量并显示适当的文本。

例如, ps aux在 80x24 终端中:
screenshot from 2015-07-23 00 47 35

在 137x24 终端中:
screenshot from 2015-07-23 00 49 35

它改变了列宽并缩短了命令,所以一切都很好地放在一行中。 一切都是为了可读性和易于人类解析。

当然,我可以编写一个 bash 包装器,它将根据$COLUMNS应用不同的格式选项,但它开始听起来真的很hacky,我认为这应该是任何命令行程序的默认行为。 很抱歉,docker 的输出很乱,很难阅读。

没有这样做是有原因的吗? 某些库中的任何限制或您的决定? 需要知道这是否值得考虑在 PR 中修复,或者,也许我在找错树。

@nsg :同意-默认输出仍然可以改进。

这个问题有更新吗?

因此,无论出于何种原因,图像散列不再在 ps 输出中被截断。 我已经不得不让我的终端超宽(占据整个屏幕)只是为了让 docker 在过去可用,现在这已经不够了。 从 1.7.1 开始,每行大约有 200 列宽。 谁使用这么宽的终端?

我一直在玩这个。

删除 ID 和 created 让我们有一些方法:

NAMES                 IMAGE          STATUS                     PORTS                         COMMAND
elegant_turing        nginx          Up 13 secs                 0.0.0.0:80->80/tcp, 443/tcp   "nginx -g 'daemon off"
composedemo_web_1     composedemo_   Exited (2) 23 secs ago                                   "/bin/sh -c 'python a"
composedemo_redis_1   redis          Exited (137) 11 secs ago                                 "/entrypoint.sh redis"
elated_carson         hello-world    Exited (0) 23 mins ago                                   "/hello"

不过还是太长了。 我们可以忽略0.0.0.0

NAMES                 IMAGE          STATUS                     PORTS                 COMMAND
elegant_turing        nginx          Up 13 secs                 80->80/tcp, 443/tcp   "nginx -g 'daemon off"
composedemo_web_1     composedemo_   Exited (2) 23 secs ago                           "/bin/sh -c 'python a"
composedemo_redis_1   redis          Exited (137) 11 secs ago                         "/entrypoint.sh redis"
elated_carson         hello-world    Exited (0) 23 mins ago                           "/hello"

但是还是有点长。 也许需要一些创造力来缩短状态......一些可解析/可扫描的东西,但仍然很短...... Exit (2) 23s ago也许?

尽管可以缩短命令,但我们还需要缩短其他任何内容以确保至少显示 _some_ 的命令。 不能缩短名字。 当图像被截断时,它可能会得到一个“...”。 长端口也一样。

想法?

一些技巧在这里: https://github.com/docker/docker/compare/master...bfirsh :7477-shorter-ps

@bfirsh我认为您正在做某事。

如果您将状态(如您所说)更改为 23 秒而不是 23 秒并截断图像和端口列,它应该足够短。

@bfirsh您开始在默认视图中工作了吗? 您是否在考虑某些人正在谈论的--format选项?

此外,我们可以使用s代替secm代替mins

@aanm我们在--format 。 您还可以更改客户端配置文件中的默认 ps 行为,添加如下内容:

{
  "psFormat": "table {{ .ID }}\\t{{ .Status }}"
}

您可以使用您更喜欢的格式设置默认值。

我经常需要查看当前容器名称,以便运行下一个docker exec来附加。

所以,我希望如果可以在NAMES之后移动IMAGE ,它会很好,我不再需要一些配置了。

谢谢。

docker 1.8.1 (fc21) 中的问题
--format 不知道容器名称。

docker ps --format "{{.ID}}t{{.Image}}t{{.CreatedAt}}t{{.RunningFor}}t{{.Status}}t{{.Name}}" -a
模板解析错误:模板::1:64:在 <.Name> 处执行“”:名称不是结构类型 *ps.containerContext 的字段

到目前为止使用:
码头工人ps -a | perl -ne 'chomp; @cols = 拆分 /s{2,}/, $_; $name=pop @cols; printf "%-28s %-20s %-20s %-30sn", $name, $cols[1], $cols[3], $cols[4]'

感谢@caiguanhao的启发。

我只是把这个留在这里:

IMAGE                                NAMES                     STATUS              PORTS
xxxxx:x.x                            xx_xxxxxxxx_xxxxx         Up About an hour    10.23.123.111:26002->6379/tcp
xxxxxxxxx:x.x                        xx_xxxxxxxx_xxxxxxxxx     Up About an hour    29015/tcp
                                                                                   10.23.123.111:26001->8080/tcp
                                                                                   10.23.123.111:26000->28015/tcp
xxxxxxxx_xx_xxxxxxxx                 xx_xxxxxxxx               Up About an hour    127.0.0.1:8086->8080/tcp
xxxxxx_xx                            xx_xxx_xxx                Up About an hour    127.0.0.1:8082->8888/tcp
xxx_xx                               xx_xxx                    Up About an hour    127.0.0.1:8083->8080/tcp
xxxx/xxxxxxxxx-xxxxxx                xx_xxx_xxxxxxxxx_xxx      Up 2 hours          10.23.123.111:25002->25565/tcp
xxxx/xxxxxxxxx-xxxxxx                xx_xxx_xxxxxxxxx_xxxxxx   Up 2 hours          10.23.123.111:25001->25565/tcp
xxxxxx/xxxxxxxx:xxxxxx               xxx_xxxxxxxx              Up 3 hours          127.0.0.1:8080->8080/tcp
xxxxxxxxxx/xxxxxxx                   xxx_xxxxxxx               Up 3 hours          10.23.123.111:25->25/tcp
                                                                                   10.23.123.111:587->587/tcp
xx_xxx                               xx_xx                     Up 3 hours          10.23.123.112:9987->9987/tcp
                                                                                   10.23.123.112:10011->10011/tcp
                                                                                   10.23.123.112:30033->30033/tcp
                                                                                   10.23.123.112:9987->9987/udp
xxxx.xx/xxxxxxxxx/xxxxxx:x.x.x       xxx_xxxxxx                Up 3 hours          10.42.241.123:22->22/tcp
                                                                                   443/tcp
                                                                                   127.0.0.1:8000->80/tcp
xxxxxx/xxxxxx-xxxxxx:xxxxxx          xxx_xxxxxx_xx_xxxxxx      Up 3 hours
xxxx.xx/xxxxxxxxx/xxxxxxxxxx:x.x-x   xxx_xxxxxx_xxxxxxxx       Up 3 hours          5432/tcp
xxxx.xx/xxxxxxxxx/xxxxx:xxxxxx       xxx_xxxxxx_xxxxx          Up 3 hours          6379/tcp

/etc/profile.d/dps.sh: https://gist.github.com/GottZ/4a6c2af314d73cd8b71d

很好@GottZ ,谢谢分享!

@thaJeztah我只是将每条偶数行加粗以提高可见度。 玩得开心:smile:

同时,我使用awk

$ alias my_docker_ps="docker ps | awk 'BEGIN{FIELDWIDTHS = \"20 33 23 20 20 70 20\"}{print \$1,\$2,\$5,\$7}'"

$ my_docker_ps         
CONTAINER ID         IMAGE                             STATUS               NAMES
b83fe9a6a06e         kibana                            Up 32 minutes        kibana              
4d78b9cd2bed         elasticsearch                     Up About an hour     evil_feynman        
fbbc40a49569         mattermost/platform               Up 9 weeks           mattermost-dev      
3b4dd9d00305         outcoldman/splunk:latest          Up 9 weeks           boring_yalow           

@danidelvalle为什么不简单;

docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}"

这已经提交并发布。 我不明白,为什么这仍然开放?

@thaJeztah你是对的,谢谢:)

@ovidiub13主要是因为https://github.com/docker/docker/issues/7477#issuecomment -123898874

是的,这很烦人..

我通常只需在终端列宽度处截断默认 ps 就可以了:

dps() {
  docker ps | cut -c-$(tput cols)
}

+1 --columns=name,id,status,image

不幸的是,这个问题仍然存在。 无论如何,一种解决方法是将以下(在 Ubuntu 中测试)放入您的.bashrc

CMD_WATCHDOCKER="watch \"docker ps -q | xargs docker inspect --format '{{.Id}} @{{.Config.Image}} @{{.Config.Cmd}} @{{range \\\$p, \\\$conf := .NetworkSettings.Ports}}{{\\\$p}}->{{(index \\\$conf 0).HostPort}}{{end}} @{{.NetworkSettings.IPAddress}}' | column -t -s='@' | cut -c 1-5,64-\""
alias watchdocker='eval $CMD_WATCHDOCKER'

运行watchdocker给出:

4596c3   ruby:2.2.2   [bash]                        172.17.0.82
827ca9   postgres     [postgres]   5432/tcp->5432   172.17.0.72

@Pithikos docker ps--format '{{ .ID }}\t{{ .Image }}\t{{ .Command }}\t{{ .Ports }}'将为您提供此功能,而无需为每个容器进行所有这些 API 调用。
您也可以将其放入~/.docker/config.json以使其成为默认格式

@cpuguy83哪个版本支持这个? 我从来没有设法让这个工作,无论是在工作中还是在家里。 如果在文档中提到哪个版本支持什么会很酷。

@Pithikos 1.8 或 1.9,不确定。

迪布斯

正确的用法是在格式字符串中使用“table”关键字,这将为您提供很好的间隔格式docker ps -a --format="table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Command}}\t{{.Status}}"

我要关闭这个,因为ps--format标志似乎正在解决这个问题。 谢谢大家!

这个问题可能没有很好地命名。 命令的 _default_ 仍然应该是 80 个字符宽。 很高兴关闭它,因为它不是那么重要。

如何添加选项以使结果垂直显示,如 MySQL 中的select * from foobar\G

我通常只想知道哪些容器正在运行(以及运行了多长时间)。

这对我有用:

$ docker ps --format "table {{.Names}}\t{{.Status}}"

更好的是,我将它包装在一个非常容易记住的别名中:

alias dps='docker ps --format "table {{.Names}}\t{{.Status}}"'

这是输出示例:

NAMES                     STATUS
projectxyz_chrome_1       Up 11 minutes
projectxyz_web_1          Up 11 minutes
projectxyz_app_1          Up 11 minutes
projectxyz_phpmyadmin_1   Up 11 minutes
projectxyz_memcached_1    Up 11 minutes
projectxyz_db_1           Up 11 minutes

您可以在此处了解有关--format命令的更多信息:
https://docs.docker.com/engine/reference/commandline/ps/

希望它可以帮助某人😃

@joshmedeski,您还可以将首选格式存储在配置文件中,以便将其用作默认值; https://docs.docker.com/engine/reference/commandline/cli/#/configuration -files

为了节省按键的精神,这里是小bash脚本我写取参数列表,构建旅途模板字符串并执行泊坞窗ps命令,以便立即给予显示任何的列在任何顺序通缉。 将配置放入文件中不够动态 - 我发现一会儿拥有一组列,一会儿再设置不同的列非常有用。 脚本在这里,希望它对某人有用。 干杯 - 安迪

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

import subprocess

show_all = False
fields = [
  "Names",
  "Command",
  "Image",
  "CreatedAt",
  "Status",
]

cmd = ['docker', 'ps']
if show_all:
  cmd += ['-a']
cmd += ['--format', '\t'.join([('{{ .'+field+' }}') for field in fields])]
response = subprocess.check_output(cmd)

dataset = [fields]
dataset_widths = [0] * len(fields)
for idx, line in enumerate(response.split('\n')[:-1]):
  fieldvalues = line.decode('utf-8').replace(u"\u2026", u"_").split('\t')
  dataset.append(fieldvalues)
  for jdx, fieldvalue in enumerate(fieldvalues):
    if dataset_widths[jdx] < len(fieldvalue):
      dataset_widths[jdx] = len(fieldvalue)

for idx, items in enumerate(dataset):
  output_line = ['{:>3d}'.format(idx)]
  for jdx, item in enumerate(items):
    output_line.append(('{:'+str(dataset_widths[jdx])+'s}').format(item))
  print '   '.join(output_line)

把它放在你的 ~/.docker/config.json
{ "psFormat": "table {{.Names}}\\t{{.Image}}\\t{{.RunningFor}} ago\\t{{.Status}}\\t{{.Command}}", "imagesFormat": "table {{.Repository}}\\t{{.Tag}}\\t{{.ID}}\\t{{.Size}}" }

并根据自己的喜好进行修改。 对我来说,问题总是长图像名称(因为它包含我的自定义图像的个人存储库名称)

每个正在寻找更好的 docker ps 的人都应该检查一下:
https://github.com/moncho/dry

解决方法黑客。 根据需要修改要保留的 $cols[x]。

docker ps | perl -ne '<strong i="7">@cols</strong> = split /\s{2,}/, $_; printf "%30s %20s %20s\n", $cols[1], $cols[3], $cols[4]'

谢谢。

这就是我所需要的:
docker ps | perl -ne '<strong i="12">@cols</strong> = split /\s{2,}/, $_; printf "%30s %20s %20s", $cols[1], $cols[4], $cols[6]'

给出图像状态名称
在对齐良好的列中

编辑

最好用这样的东西创建一个 bash 别名:

docker ps --format="table {{.Image}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}"

注意“表格”格式

解决方法黑客。 根据需要修改要保留的 $cols[x]。

docker ps | perl -ne '<strong i="7">@cols</strong> = split /\s{2,}/, $_; printf "%30s %20s %20s\n", $cols[1], $cols[3], $cols[4]'

太棒了,thnx

@nagracks如果您希望该格式作为默认格式,我建议使用--format方法(可以存储在您的~/.docker/config.json配置文件中)

如果我用这样的自定义修改我的.docker/config.json文件:

"imagesFormat": "table {{.ID}}  {{.Repository}}\t{{.Tag}}  {{.CreatedSince}}  {{.Size}}",
"psFormat": "table {{.ID}}  {{.Names}}\t{{.Image}}  {{.Command}}  {{.Status}}",

然后如何使用docker ps命令查看默认格式? 我试过docker ps --format "" ,但它仍然使用配置。

使用docker ps --format=table应该给出默认的表格格式

如果默认情况下有一个不太详细的输出版本,我将不胜感激,而不必记住表格格式化语法是什么或格式化上下文中的变量名是什么。 即使默认保持原样,_pre-formatted_ 不太详细的版本的标志也会很有用。

至于可以从不太冗长的版本中减少哪些信息,这是我的两分钱:

  • 大多数用途的名称和 ID 都具有相同的目的,并且可以将其删除。
  • 创建日期时间可能是您可以从不太冗长的输出中省略的内容
  • 我个人也可以从不太冗长的输出中省略端口

在我的用例中,我通常只想查找要运行其他一些命令的容器的名称(例如,在远程服务器节点上),并且将输出包裹在多行中使得很难找出我感兴趣的容器的确切名称。

我有点失望这里的“批准”解决方案是“只需使用 --format 参数配置别名”,就好像您总是在定义了别名的环境中运行这些命令,或者记住格式化语法和上下文变量

我仍然每天都会遇到这个问题,FWIW。 我当前的docker ps -a是 _180 个字符宽_ -- 超过我 27 英寸 4K 屏幕的一半!

CONTAINER ID        IMAGE                                          COMMAND                 CREATED             STATUS                    PORTS               NAMES
994be99dddd1        nvidia/cuda:10.2-devel-ubuntu18.04             "bash"                  4 days ago          Exited (0) 4 days ago                         eager_tesla
30796cc3db32        nvidia/cuda:10.2-devel-ubuntu18.04             "bash"                  4 days ago          Exited (127) 4 days ago                       laughing_maxwell
ed5f20c1cff3        gcr.io/deeplearning-platform-release/tf2-gpu   "/entrypoint.sh bash"   4 days ago          Exited (0) 3 days ago                         distracted_ardinghelli
0bb06e992ef4        gcr.io/deeplearning-platform-release/tf2-gpu   "/entrypoint.sh bash"   4 days ago          Exited (0) 4 days ago                         bold_brahmagupta

不应期望普通用户为他们的docker ps命令起别名,只是为了使其在合理大小的终端上可读。 也许它不必像 80 个字符那么小,但它肯定不应该是 180 个字符。

我很想以稻草人的身份打开拉取请求。 😏

此页面是否有帮助?
0 / 5 - 0 等级