Output from docker ps
is very hard to read on 80 character wide terminals.
/bin/ps
does a pretty good job of wrapping output on narrow terminals (e.g. putting important information first, command last and truncating it). I wonder if we can do better.
So much love and many +1s. I use 80x24 terminals (much to the chagrin of
my colleagues) and this one has been a minor irritant for me for quite some
time.
I have to say this often gets me as well.
Any ideas for a solution? Having a smaller version on narrower terminals sounds nice.
Well, ID doesn't really need to be there.
How about this:
NAME IMAGE STATUS PORTS COMMAND
prickly_perlman ubuntu:14.04 Up 15s 8000->8000/tcp sleep 30000
Explanation:
/bin/ps
@bfirsh :thumbsup: with these notes;
--no-trunc
, now that container-id is no longer visible? Many examples exist that rely on this feature to purge stopped containers--columns=a,f,g
--sort=a,e
-a
))What's wrong with piping to a pager?
docker ps | less -S
@benjamin-thomas or docker ps
detecting a TTY and piping to less -S
by default?
Nice trick @benjamin-thomas , I will definitely use that in the future. One consideration is that does leave off information I care about, most importantly, container names. Whereas in my usecase I don't usually care as much about e.g. CREATED
and STATUS
.
IMO the use case may vary among users, for me, STATUS
_is_ important to get a quick check if my containers are still running nicely or made a 'whoopsie'.
I'm not really sure if this should become a large re-implementation of ps output, or to _start_ with making it a bit cleaner by default and building upon that, making it more configurable by adding options to specify columns to show, sort order and filtering.
@nathanleclaire, just use your arrow keys once you're inside less
, you have access to the whole content. Or did I misunderstand you?
@grahamc why not, personally I prefer tools not to do those things automatically. One could always define a shell alias for this IMO if that's needed.
@thaJeztah specifying the column names with switches makes sense to me, like the system ps command /bin/ps -o pid,ruser=RealUser -o comm=Command
.
@benjamin-thomas Oh, I hadn't even realized that. Nice! I like this solution a lot.
@benjamin-thomas /bin/ps
does this automatically. If you want to disable it, you can pipe it through cat
or whatever.
Related to the width of docker ps
output: is it really necessary to treat every possible chain of linkages to a given container as a new name for that container? E.g., if I have five containers named A, B, C, D, and E, and A links to B, B links to C, and so on, then E will have five different names: E, D/E, C/D/E, B/C/D/E, and A/B/C/D/E.
Then if B also links to, say, D, E gets even MORE names: B/D/E and A/B/D/E. One run of the system I'm working on starts seventeen containers -- which, all together, owing to 31 dependency relationships, have _three hundred and eighty-seven names_. No matter how wide I make my terminal windows, the output of docker ps
is unreadable without a pager. Does it really make sense for the number of names to be _worse than quadratic_ in the number of containers? It would at least be nice if there were a way to disable this pedantic level of enumeration.
@mraccident :+1: docker ps
should only show the primary name, not all names for that container
Salut, it was bothering me as well and I just added a '--short' option to docker. keeping the complete port-column.
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.
$
Since I am a newbe to go, I guess my code could be... optimized...
But amazing how easy it is to change the code, as a yearlong python guy. I like it!
EDIT: Maybe one could fetch the size of the terminal and kick out columns to shorten the lines...
EDIT2: I shorten the NAMES and added a count(CHILDREN), even though it is a little bit misleading, because it counts fd3->fd2->fd1 as well.
$ ~/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: Now I extract the correct name
$ ./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
I feel that the ports definition and the verbosity of the times are a big part of the width of the docker ps
output. I think abbreviating the times and making the ports definitions wrap over lines would save a lot of space (in addition to allowing me to select/hide columns).
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
What about allowing to provide a template for example by setting an environment variable DOCKER_PS_FORMAT
with columname:width:modifier,columname:width:modifier, ...
where modifier
might allow additional settings like no-trunc
, full
(for example for container id) or short
for CREATED
where ~1h
could be a short form for About an hour ago
.
I wrote this bash/zsh function in my ~/.bashrc
to better display output of docker ps
, you can hide or re-order the columns:
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 $@; }
Workaround hack. Modify which $cols[x] you want to keep as desired.
docker ps | perl -ne '@cols = split /\s{2,}/, $_; printf "%30s %20s %20s\n", $cols[1], $cols[3], $cols[4]'
Wouldn't it be easier to have something like:
$ docker ps --columns=name,id,status,image
and everybody could just alias docker ps
.
Thanks, @caiguanhao. Clever interim solution. Added it as a Tackle plugin for the fish shell.
Guys, just made a small improvement on @caiguanhao's code to be able to choose which columns to show. When you have a container that exposes many ports (like the Consul service, which exposes 5 or 6 ports and can make even a 300-characters-wide screen overflow), it's nice to have a command to show every column except those ports, and then another one that shows only the name of the containers and its ports (I added these options as new commands by default):
https://github.com/jpmelos/dotfiles/commit/457a9c68f87eb5bd455aa22bdadab81c2651c2ea
One simple change that would help a little is to reduce the spacing between the CONTAINER ID and IMAGE columns. The other columns are all separated by 3 spaces, but these two are separated by 8.
My 5 cents until they make 'docker ps' readable:
Are we going to see any update on that?
docker ps
is the most common command I think. I hope it's not so hard to give us the option to filter columns to show.
( I'd expect something like that )
Like @AntouanK said and @wpp already suggested, a columns flag would be prefered for most situations
I think #10255 should address this.
@duglin Does this make the default shorter, though? I'd like to keep this open if not.
@bfirsh good point, no it wouldn't change the default. But I'm not sure we can change the default until v2 (if/when that is) because we'd break existing clients if we did.
same here. maybe some intelligent mechanism that selects default columns displayed by applying thresholds to ENV['COLUMNS']?
I agree with https://github.com/docker/docker/issues/7477#issuecomment-70243594, just give us the option to choose the columns.
I also vote for the https://github.com/docker/docker/issues/7477#issuecomment-70243594 option.
docker ps
would be docker ps --columns=id,image,command,created,status,ports,name
and it could be easily to implement more columns such as ip
as some users wanted https://github.com/docker/docker/issues/8786
+1 for --columns
As a workaround, I combine docker ps -q
with docker inspect --format
:
docker ps -q | xargs docker inspect --format '{{printf "%.12s\t%s" .Id .Config.Cmd}}'
You have to dig into the output of docker inspect and golang templating, but it's almost infinitely configurable.
@jafcrocker Nice one. Maybe we can make a public gist to keep there a collection of workarounds like this one? Until we get some flags to customise the output properly...
we just merged #14699 that allows you to run docker ps --format ...
to change the ps output. You can also set a default format if you want, check this screenshot out:
I'm going to close this issue as fixed. Please, feel free to give that a try and let us know what you think.
For those wanting to give it a try, "master" builds can be found at https://master.dockerproject.org and this feature should be in there soon (if not already)
While the --format
is a really nice addition, I do not think this solves the primary problem. Almost all command line tools that I use daily handles variable sized terminals properly. Most by looking at the $COLUMNS
environment variable and displaying the text appropriate.
For example, ps aux
in a 80x24 terminal:
And in a 137x24 terminal:
It changes column width and shortens the command so everything fits nicely in one line. Everything for readability and easy to parse for a human.
Sure, I can write a bash wrapper that will apply different formatting options depending on $COLUMNS
but it starts to sounds really hacky and something I think should be default behaviour for any command line program. I'm sorry to say, the output of docker is messy and hard to read.
Is there a reason this is not done? Any limitation in some library or a decision from your part? Need to know if this is something worth to consider to fix in a PR, or, maybe I'm barking up the wrong tree.
@nsg: Agreed - the default output could still do with improvement.
Has there been any update on this issue?
So for whatever reason, image hashes are no longer truncated in ps output. I already had to make my terminal ultra-wide (taking up the whole screen) just to make docker usable in the past, now that's no longer enough. As of 1.7.1, each line is about 200 columns wide. Who uses a terminal that wide?
I've been playing around a bit with this.
Removing ID and created gets us a bit of the way there:
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"
Still too long though. We could ignore 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"
But still a bit long. Perhaps some creativity is needed to shorten the status... something parseable/scannable, but still short... Exit (2) 23s ago
maybe?
Although the command can be shortened, we also would need to shorten anything else to make sure at least _some_ of the command is shown. Can't shorten the name. The image could perhaps get a "..." when it's truncated. Same for long ports.
Thoughts?
Some hacks are here: https://github.com/docker/docker/compare/master...bfirsh:7477-shorter-ps
@bfirsh I think you're on to something.
If you change Status (like you said) to 23s instead of 23 secs and trunc both image and ports column it should be short enough.
@bfirsh you're starting to work in the default view? Are you thinking the --format
option some people are talking?
Also, we could use s
instead of sec
and m
instead of mins
@aanm we already have the --format
in docker 1.8. You can also change the default ps behavior in the client configuration file adding something like this:
{
"psFormat": "table {{ .ID }}\\t{{ .Status }}"
}
You can set your default with the format you like better.
I often need to see current container name, for run next docker exec
to attach in.
so, I hope if can move NAMES
after IMAGE
, it will good, I don't need some config anymore.
Thanks.
Problem in docker 1.8.1 (fc21)
--format does not know about container names.
docker ps --format "{{.ID}}t{{.Image}}t{{.CreatedAt}}t{{.RunningFor}}t{{.Status}}t{{.Name}}" -a
Template parsing error: template: :1:64: executing "" at <.Name>: Name is not a field of struct type *ps.containerContext
So far using:
docker ps -a | perl -ne 'chomp; @cols = split /s{2,}/, $_; $name=pop @cols; printf "%-28s %-20s %-20s %-30sn", $name, $cols[1], $cols[3], $cols[4]'
@parf the placeholder is actually called Names
:
thanks to @caiguanhao for inspiration.
i'm just leaving this here:
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
Nice @GottZ, thanks for sharing!
@thaJeztah i just made each even line bold for better visibility. have fun :smile:
Meanwhile, my approach with 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 why not simply;
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}"
This has already been committed and released. I don't understand, why is this still open?
@thaJeztah you're right, thanks :)
@ovidiub13 mainly because of https://github.com/docker/docker/issues/7477#issuecomment-123898874
yeah this is annoying..
I'm usually fine with just truncating the default ps at the terminal colum width:
dps() {
docker ps | cut -c-$(tput cols)
}
+1 for --columns=name,id,status,image
This issue still exists unfortunately. Anyhow a workaround is to put the below (tested in Ubuntu) in your .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'
Running watchdocker
gives:
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 }}'
will give you this without making all those API calls for each container.
Also you can put this into ~/.docker/config.json
to make it the default format
@cpuguy83 which version does support this? I never managed to get this working, neither at work or home. Would be cool if in the docs it was mentioned which version supports what.
@Pithikos Either 1.8 or 1.9, not sure.
fit docker ps/images to 80 columns
correct usge is with "table" keyword in format string, this will give you nice spaced formatting docker ps -a --format="table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Command}}\t{{.Status}}"
I'm closing this one as it seems that the --format
flag for ps
is addressing the issue. Thanks all!
This issue was perhaps not well named. It still remains that the _default_ for commands should be 80 chars wide. Happy for this to be closed though because it's not that important.
--format
seems not well enough.
https://docs.docker.com/engine/reference/commandline/ps/#/formatting
how about add option to make result display vertically, like select * from foobar\G
in MySQL
I usually just want to know which containers are running (and for how long).
This does the trick for me:
$ docker ps --format "table {{.Names}}\t{{.Status}}"
Even better, I wrapped it in a really easy to remember alias:
alias dps='docker ps --format "table {{.Names}}\t{{.Status}}"'
Here's a sample of the output:
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
You can learn more about the --format
command here:
https://docs.docker.com/engine/reference/commandline/ps/
Hope it helps someone 馃槂
@joshmedeski you can also store your preferred formatting in a configuration file, so that it is used as default; https://docs.docker.com/engine/reference/commandline/cli/#/configuration-files
In the spirit of saving keystrokes here is the small bash script I wrote to take a list of arguments, construct the go template string and execute the docker ps command so as to give immediate display of whatever columns are wanted in whatever order. Putting configuration in a file is not dynamic enough - I find that having one set of columns one moment and different set a moment later is pretty useful. Script is here, hope its useful to someone. Cheers -andy
#!/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)
put this in your ~/.docker/config.json
{
"psFormat": "table {{.Names}}\\t{{.Image}}\\t{{.RunningFor}} ago\\t{{.Status}}\\t{{.Command}}",
"imagesFormat": "table {{.Repository}}\\t{{.Tag}}\\t{{.ID}}\\t{{.Size}}"
}
And modify to your liking. For me the problem was always long image name (since it contained my personal repository name for my custom images)
everyone who is looking for a better docker ps should check this out:
https://github.com/moncho/dry
Workaround hack. Modify which $cols[x] you want to keep as desired.
docker ps | perl -ne '@cols = split /\s{2,}/, $_; printf "%30s %20s %20s\n", $cols[1], $cols[3], $cols[4]'
Thanks.
This was all that I needed:
docker ps | perl -ne '@cols = split /\s{2,}/, $_; printf "%30s %20s %20s", $cols[1], $cols[4], $cols[6]'
giving IMAGE STATUS NAMES
in well aligned columuns
EDIT
it it better to create a bash alias with something like this:
docker ps --format="table {{.Image}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}"
Notice the "table" format
Workaround hack. Modify which $cols[x] you want to keep as desired.
docker ps | perl -ne '@cols = split /\s{2,}/, $_; printf "%30s %20s %20s\n", $cols[1], $cols[3], $cols[4]'
That's awesome, thnx
@nagracks if you want that format as default, I'd recommend using the --format
approach (which can be stored in your ~/.docker/config.json
configuration file)
If I modify my .docker/config.json
file with something custom like this:
"imagesFormat": "table {{.ID}} {{.Repository}}\t{{.Tag}} {{.CreatedSince}} {{.Size}}",
"psFormat": "table {{.ID}} {{.Names}}\t{{.Image}} {{.Command}} {{.Status}}",
How can I then use the docker ps
command to view the default format? I tried docker ps --format ""
, but it still used the config.
Using docker ps --format=table
should give the default table format
I would really appreciate if there was a less-verbose version of the output available by default, without having to remember what the table formatting syntax is or what the variable names are in the formatting context. Even if the default would be kept as it is, a flag for a _pre-formatted_ less verbose version would be useful.
As to what information could be reduced from a less verbose version, here's my two cents:
In my use case I usually just want to look up the name of the container I'll be running some other commands against (e.g. on a remote server node), and having the output be wrapped across multiple lines makes it difficult to find out the exact name of the container I'm interested in.
I'm somewhat disappointed the "approved" solution here is "just configure an alias with --format parameter", as if you would always be running these commands in environments where you have your alias defined, or remember the formatting syntax and context variables
I still run into this issue daily, FWIW. My current output of docker ps -a
is _180 characters wide_ -- more than half of my 27" 4K screen!
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
The average user shouldn't be expected to alias their docker ps
command just to make it readable on a reasonably sized terminal. Maybe it doesn't have to be as small as 80 characters, but it certainly shouldn't be 180 characters.
I'm tempted to open a pull request as a strawman. 馃槒
Most helpful comment
What's wrong with piping to a pager?