La salida de docker ps
es muy difícil de leer en terminales de 80 caracteres de ancho.
/bin/ps
hace un muy buen trabajo al envolver la salida en terminales estrechos (por ejemplo, colocando la información importante primero, el comando al final y truncándolo). Me pregunto si podemos hacerlo mejor.
Mucho amor y muchos +1. Uso terminales de 80x24 (para disgusto de
mis colegas) y este ha sido un irritante menor para mí durante bastante tiempo.
hora.
Tengo que decir que esto a menudo también me afecta.
¿Alguna idea para la solución? Tener una versión más pequeña en terminales más estrechos suena bien.
Bueno, la identificación realmente no necesita estar allí.
Qué tal esto:
NAME IMAGE STATUS PORTS COMMAND
prickly_perlman ubuntu:14.04 Up 15s 8000->8000/tcp sleep 30000
Explicación:
/bin/ps
@bfirsh :
--no-trunc
, ahora que la identificación del contenedor ya no está visible? Existen muchos ejemplos que se basan en esta función para purgar contenedores detenidos--columns=a,f,g
--sort=a,e
-a
))¿Qué hay de malo en canalizar a un buscapersonas?
docker ps | less -S
@benjamin-thomas o docker ps
detectando un TTY y canalizando a less -S
de forma predeterminada?
Buen truco @benjamin-thomas, definitivamente lo usaré en el futuro. Una consideración es que deja fuera la información que me importa, lo que es más importante, los nombres de los contenedores. Mientras que en mi caso de uso generalmente no me importa tanto, por ejemplo, CREATED
y STATUS
.
En mi opinión, el caso de uso puede variar entre los usuarios, para mí, STATUS
_es_ importante para obtener una verificación rápida si mis contenedores todavía funcionan bien o si hicieron un 'whoopsie'.
No estoy realmente seguro de si esto debería convertirse en una gran reimplementación de la salida de ps, o si _comenzar_ haciéndolo un poco más limpio de forma predeterminada y basándose en eso, haciéndolo más configurable agregando opciones para especificar columnas para mostrar, orden de clasificación y filtrado.
@nathanleclaire , solo use las teclas de flecha una vez que esté dentro de less
, tendrá acceso a todo el contenido. ¿O te entendí mal?
@grahamc por qué no, personalmente prefiero que las herramientas no hagan esas cosas automáticamente. Siempre se puede definir un alias de shell para este IMO si es necesario.
@thaJeztah especificar los nombres de las columnas con interruptores tiene sentido para mí, como el comando ps del sistema /bin/ps -o pid,ruser=RealUser -o comm=Command
.
@ benjamin-thomas Oh, ni siquiera me había dado cuenta de eso. ¡Bonito! Me gusta mucho esta solución.
@benjamin-thomas /bin/ps
hace esto automáticamente. Si desea desactivarlo, puede canalizarlo a través de cat
o lo que sea.
Relacionado con el ancho de la salida docker ps
: ¿es realmente necesario tratar cada posible cadena de enlaces a un contenedor dado como un nuevo nombre para ese contenedor? Por ejemplo, si tengo cinco contenedores llamados A, B, C, D y E, y A se vincula a B, B se vincula a C, y así sucesivamente, entonces E tendrá cinco nombres diferentes: E, D/E, C/ D/E, B/C/D/E y A/B/C/D/E.
Entonces, si B también se vincula a, digamos, D, E obtiene aún MÁS nombres: B/D/E y A/B/D/E. Una ejecución del sistema en el que estoy trabajando inicia diecisiete contenedores, que, en total, debido a 31 relaciones de dependencia, tienen _trescientos ochenta y siete nombres_. No importa qué tan amplia sea la ventana de mi terminal, la salida de docker ps
es ilegible sin un buscapersonas. ¿Realmente tiene sentido que el número de nombres sea _peor que cuadrático_ en el número de contenedores? Al menos sería bueno si hubiera una forma de desactivar este pedante nivel de enumeración.
@mraccident :+1: docker ps
solo debe mostrar el nombre principal, no todos los nombres de ese contenedor
Salut, también me estaba molestando y acabo de agregar una opción '--short' a la ventana acoplable. manteniendo la columna de puerto completa.
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.
$
Como soy un novato, supongo que mi código podría ser... optimizado...
Pero es sorprendente lo fácil que es cambiar el código, como un tipo de Python de un año. ¡Me gusta esto!
EDITAR: Tal vez uno podría obtener el tamaño de la terminal y eliminar columnas para acortar las líneas ...
EDIT2: acorté los NOMBRES y agregué un conteo (NIÑOS), aunque es un poco engañoso, porque también cuenta 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: ahora extraigo el nombre correcto
$ ./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
Siento que la definición de los puertos y la verbosidad de los tiempos son una gran parte del ancho de la salida docker ps
. Creo que abreviar los tiempos y hacer que las definiciones de los puertos se ajusten a las líneas ahorraría mucho espacio (además de permitirme seleccionar/ocultar columnas).
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
¿Qué hay de permitir proporcionar una plantilla, por ejemplo, configurando una variable de entorno DOCKER_PS_FORMAT
con columname:width :modifier, columname:width :modifier, ...
donde modifier
podría permitir configuraciones adicionales como no-trunc
, full
(por ejemplo, para la identificación del contenedor) o short
para CREATED
donde ~1h
podría ser una forma abreviada de About an hour ago
.
Escribí esta función bash/zsh en mi ~/.bashrc
para mostrar mejor la salida de docker ps
, puede ocultar o reordenar las columnas:
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 $@; }
Truco de solución. Modifique qué $cols[x] desea mantener como desee.
docker ps | perl -ne '<strong i="6">@cols</strong> = split /\s{2,}/, $_; printf "%30s %20s %20s\n", $cols[1], $cols[3], $cols[4]'
¿No sería más fácil tener algo como:
$ docker ps --columns=name,id,status,image
y todos podrían simplemente alias docker ps
.
Gracias, @caiguanhao. Solución provisional inteligente. Se agregó como un complemento Tackle para el caparazón de pescado.
Chicos, acabo de hacer una pequeña mejora en el código de @caiguanhao para poder elegir qué columnas mostrar. Cuando tiene un contenedor que expone muchos puertos (como el servicio Consul, que expone 5 o 6 puertos y puede hacer que una pantalla de 300 caracteres de ancho se desborde), es bueno tener un comando para mostrar todas las columnas excepto esos puertos, y luego otro que muestra solo el nombre de los contenedores y sus puertos (agregué estas opciones como nuevos comandos por defecto):
https://github.com/jpmelos/dotfiles/commit/457a9c68f87eb5bd455aa22bdadab81c2651c2ea
Un cambio simple que ayudaría un poco es reducir el espacio entre las columnas IDENTIFICACIÓN DEL CONTENEDOR e IMAGEN. Las otras columnas están separadas por 3 espacios, pero estas dos están separadas por 8.
Mis 5 centavos hasta que hagan legible 'docker ps':
¿Vamos a ver alguna actualización al respecto?
docker ps
es el comando más común, creo. Espero que no sea tan difícil darnos la opción de filtrar columnas para mostrar.
(Yo esperaría algo así como que )
Como dijo @AntouanK y @wpp ya sugirió, se
Creo que # 10255 debería abordar esto.
@duglin ¿Esto hace que el valor predeterminado sea más corto? Me gustaría mantener esto abierto si no.
@bfirsh buen punto, no, no cambiaría el valor predeterminado. Pero no estoy seguro de que podamos cambiar el valor predeterminado hasta v2 (si/cuando sea eso) porque romperíamos los clientes existentes si lo hiciéramos.
aquí igual. ¿tal vez algún mecanismo inteligente que seleccione las columnas predeterminadas que se muestran aplicando umbrales a ENV['COLUMNS']?
Estoy de acuerdo con https://github.com/docker/docker/issues/7477#issuecomment -70243594, solo danos la opción de elegir las columnas.
También voto por la opción https://github.com/docker/docker/issues/7477#issuecomment -70243594.
docker ps
sería docker ps --columns=id,image,command,created,status,ports,name
y podría ser fácil implementar más columnas como ip
como querían algunos usuarios https://github.com/docker/docker/issues/8786
+1 para --columnas
Como solución alternativa, combino docker ps -q
con docker inspect --format
:
docker ps -q | xargs docker inspect --format '{{printf "%.12s\t%s" .Id .Config.Cmd}}'
Tienes que profundizar en la salida de docker inspect y golang template, pero es casi infinitamente configurable.
@jafcrocker Buen día. ¿Tal vez podamos hacer una esencia pública para mantener allí una colección de soluciones como esta? Hasta que obtengamos algunas banderas para personalizar la salida correctamente...
acabamos de fusionar #14699 que le permite ejecutar docker ps --format ...
para cambiar la salida de ps. También puede establecer un formato predeterminado si lo desea, consulte esta captura de pantalla:
Voy a cerrar este tema como solucionado. Por favor, siéntase libre de probarlo y háganos saber lo que piensa.
Para aquellos que quieran probarlo, las compilaciones "maestras" se pueden encontrar en https://master.dockerproject.org y esta característica debería estar allí pronto (si no lo está ya)
Si bien el --format
es una muy buena adición, no creo que esto resuelva el problema principal. Casi todas las herramientas de línea de comandos que uso a diario manejan correctamente terminales de tamaño variable. La mayoría mirando la variable de entorno $COLUMNS
y mostrando el texto apropiado.
Por ejemplo, ps aux
en una terminal de 80x24:
Y en una terminal de 137x24:
Cambia el ancho de la columna y acorta el comando para que todo encaje bien en una línea. Todo para la legibilidad y fácil de analizar para un humano.
Claro, puedo escribir un envoltorio de bash que aplicará diferentes opciones de formato dependiendo de $COLUMNS
pero comienza a sonar muy raro y creo que debería ser el comportamiento predeterminado para cualquier programa de línea de comandos. Lamento decirlo, la salida de la ventana acoplable es desordenada y difícil de leer.
¿Hay alguna razón por la que esto no se haga? ¿Alguna limitación en alguna biblioteca o una decisión de su parte? Necesito saber si esto es algo que vale la pena considerar para arreglar en un PR, o tal vez estoy ladrando al árbol equivocado.
@nsg : De acuerdo: la salida predeterminada aún podría mejorar.
¿Ha habido alguna actualización sobre este tema?
Entonces, por alguna razón, los valores hash de la imagen ya no se truncan en la salida ps. Ya tenía que hacer mi terminal ultra ancho (que ocupaba toda la pantalla) solo para que la ventana acoplable se pudiera usar en el pasado, ahora eso ya no es suficiente. A partir de 1.7.1, cada línea tiene unas 200 columnas de ancho. ¿Quién usa un terminal tan ancho?
He estado jugando un poco con esto.
Eliminar ID y created nos lleva un poco al camino:
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"
Aunque todavía demasiado tiempo. Podríamos ignorar 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"
Pero todavía un poco largo. Tal vez se necesite algo de creatividad para acortar el estado... algo analizable/escaneable, pero aún así corto... ¿ Exit (2) 23s ago
tal vez?
Aunque el comando se puede acortar, también necesitaríamos acortar cualquier otra cosa para asegurarnos de que se muestre al menos _algo_ del comando. No se puede acortar el nombre. La imagen quizás podría obtener un "..." cuando está truncada. Lo mismo para puertos largos.
¿Pensamientos?
Algunos trucos están aquí: https://github.com/docker/docker/compare/master...bfirsh:7477-shorter-ps
@bfirsh Creo que estás en algo.
Si cambia el estado (como dijo) a 23 segundos en lugar de 23 segundos y trunca la columna de imagen y puertos, debería ser lo suficientemente corto.
@bfirsh, ¿está comenzando a trabajar en la vista predeterminada? ¿Estás pensando en la opción --format
algunas personas están hablando?
Además, podríamos usar s
lugar de sec
y m
lugar de mins
@aanm ya tenemos el --format
en docker 1.8. También puede cambiar el comportamiento ps predeterminado en el archivo de configuración del cliente agregando algo como esto:
{
"psFormat": "table {{ .ID }}\\t{{ .Status }}"
}
Puede establecer su valor predeterminado con el formato que más le guste.
A menudo necesito ver el nombre del contenedor actual, para ejecutar el siguiente docker exec
para adjuntarlo.
Entonces, espero que si pueda mover NAMES
después de IMAGE
, estará bien, ya no necesito ninguna configuración.
Gracias.
Problema en docker 1.8.1 (fc21)
--format no conoce los nombres de los contenedores.
docker ps --format "{{.ID}}t{{.Imagen}}t{{.Creado en}}t{{.RunningFor}}t{{.Estado}}t{{.Nombre}}" -a
Error de análisis de plantilla: plantilla: :1:64: ejecutando "" en <.Name>: el nombre no es un campo de tipo de estructura *ps.containerContext
Hasta ahora usando:
ventana acoplable ps-a | perl -ne 'chomp; @cols = división /s{2,}/, $_; $nombre=pop @cols; printf "%-28s %-20s %-20s %-30sn", $nombre, $columnas[1], $columnas[3], $columnas[4]'
@parf el marcador de posición en realidad se llama Names
:
gracias a @caiguanhao por la inspiración.
solo dejo esto por aqui:
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
Genial @GottZ , ¡gracias por compartir!
@thaJeztah acabo de
Mientras tanto, mi enfoque con 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 por qué no simplemente;
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}"
Esto ya ha sido comprometido y liberado. No entiendo, ¿por qué sigue abierto?
@thaJeztah tienes razón, gracias :)
@ovidiub13 principalmente debido a https://github.com/docker/docker/issues/7477#issuecomment -123898874
si, esto es molesto..
Por lo general, estoy bien con solo truncar el ps predeterminado en el ancho de la columna del terminal:
dps() {
docker ps | cut -c-$(tput cols)
}
+1 por --columns=name,id,status,image
Lamentablemente, este problema todavía existe. De todos modos, una solución es poner lo siguiente (probado en Ubuntu) en su .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'
Ejecutar watchdocker
da:
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 }}'
le dará esto sin hacer todas esas llamadas API para cada contenedor.
También puede poner esto en ~/.docker/config.json
para que sea el formato predeterminado
@ cpuguy83, ¿ qué versión admite esto? Nunca logré que esto funcionara, ni en el trabajo ni en casa. Sería genial si en los documentos se mencionara qué versión es compatible con qué.
@Pithikos 1.8 o 1.9, no estoy seguro.
ajustar docker ps/images a 80 columnas
el uso correcto es con la palabra clave "tabla" en la cadena de formato, esto le dará un buen formato espaciado docker ps -a --format="table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Command}}\t{{.Status}}"
Estoy cerrando este porque parece que el indicador --format
para ps
está solucionando el problema. ¡Gracias a todos!
Este problema quizás no fue bien nombrado. Todavía queda que el _predeterminado_ para los comandos debe tener 80 caracteres de ancho. Feliz de que esto se cierre porque no es tan importante.
--format
parece no estar lo suficientemente bien.
https://docs.docker.com/engine/reference/commandline/ps/#/formatting
¿Qué tal agregar la opción para que los resultados se muestren verticalmente, como select * from foobar\G
en MySQL?
Por lo general, solo quiero saber qué contenedores se están ejecutando (y por cuánto tiempo).
Esto hace el truco para mí:
$ docker ps --format "table {{.Names}}\t{{.Status}}"
Aún mejor, lo envolví en un alias realmente fácil de recordar:
alias dps='docker ps --format "table {{.Names}}\t{{.Status}}"'
Aquí hay una muestra de la salida:
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
Puede obtener más información sobre el comando --format
aquí:
https://docs.docker.com/engine/reference/commandline/ps/
Espero que ayude a alguien 😃
@joshmedeski también puede almacenar su formato preferido en un archivo de configuración, para que se use por defecto; https://docs.docker.com/engine/reference/commandline/cli/#/configuration-files
Con el espíritu de guardar las pulsaciones de teclas, aquí está el pequeño script bash que escribí para tomar una lista de argumentos, construir la cadena de plantilla go y ejecutar el comando docker ps para mostrar de inmediato las columnas que se desean en cualquier orden. Poner la configuración en un archivo no es lo suficientemente dinámico; encuentro que tener un conjunto de columnas en un momento y un conjunto diferente un momento después es bastante útil. El guión está aquí , espero que sea útil para alguien. Saludos -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)
pon esto en tu ~/.docker/config.json
{
"psFormat": "table {{.Names}}\\t{{.Image}}\\t{{.RunningFor}} ago\\t{{.Status}}\\t{{.Command}}",
"imagesFormat": "table {{.Repository}}\\t{{.Tag}}\\t{{.ID}}\\t{{.Size}}"
}
Y modifica a tu gusto. Para mí, el problema siempre fue el nombre largo de la imagen (ya que contenía el nombre de mi repositorio personal para mis imágenes personalizadas)
todos los que estén buscando un mejor docker ps deberían ver esto:
https://github.com/moncho/seco
Truco de solución. Modifique qué $cols[x] desea mantener como desee.
docker ps | perl -ne '<strong i="7">@cols</strong> = split /\s{2,}/, $_; printf "%30s %20s %20s\n", $cols[1], $cols[3], $cols[4]'
Gracias.
Esto era todo lo que necesitaba:
docker ps | perl -ne '<strong i="12">@cols</strong> = split /\s{2,}/, $_; printf "%30s %20s %20s", $cols[1], $cols[4], $cols[6]'
dando NOMBRES DE ESTADO DE IMAGEN
en columnas bien alineadas
EDITAR
es mejor crear un alias bash con algo como esto:
docker ps --format="table {{.Image}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}"
Observe el formato de "tabla"
Truco de solución. Modifique qué $cols[x] desea mantener como desee.
docker ps | perl -ne '<strong i="7">@cols</strong> = split /\s{2,}/, $_; printf "%30s %20s %20s\n", $cols[1], $cols[3], $cols[4]'
Eso es increíble, gracias
@nagracks si desea ese formato como predeterminado, le recomiendo usar el enfoque --format
(que se puede almacenar en su archivo de configuración ~/.docker/config.json
)
Si modifico mi archivo .docker/config.json
con algo personalizado como esto:
"imagesFormat": "table {{.ID}} {{.Repository}}\t{{.Tag}} {{.CreatedSince}} {{.Size}}",
"psFormat": "table {{.ID}} {{.Names}}\t{{.Image}} {{.Command}} {{.Status}}",
¿Cómo puedo usar el comando docker ps
para ver el formato predeterminado? Probé docker ps --format ""
, pero aún usaba la configuración.
Usar docker ps --format=table
debería dar el formato de tabla predeterminado
Realmente agradecería si hubiera una versión menos detallada de la salida disponible de forma predeterminada, sin tener que recordar cuál es la sintaxis de formato de la tabla o cuáles son los nombres de las variables en el contexto de formato. Incluso si el valor predeterminado se mantuviera como está, sería útil una marca para una versión _preformateada_ menos detallada.
En cuanto a qué información podría reducirse de una versión menos detallada, aquí están mis dos centavos:
En mi caso de uso, generalmente solo quiero buscar el nombre del contenedor contra el que ejecutaré otros comandos (por ejemplo, en un nodo de servidor remoto), y tener la salida envuelta en varias líneas hace que sea difícil encontrar el nombre exacto del contenedor que me interesa.
Estoy un poco decepcionado de que la solución "aprobada" aquí sea "simplemente configure un alias con el parámetro --format", como si siempre estuviera ejecutando estos comandos en entornos donde tiene definido su alias, o recuerda la sintaxis de formato y las variables de contexto
Todavía me encuentro con este problema todos los días, FWIW. Mi salida actual de docker ps -a
tiene _180 caracteres de ancho_, ¡más de la mitad de mi pantalla 4K de 27"!
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
No se debe esperar que el usuario promedio cree un alias para su comando docker ps
solo para que sea legible en una terminal de tamaño razonable. Tal vez no tenga que ser tan pequeño como 80 caracteres, pero ciertamente no debería tener 180 caracteres.
Estoy tentado a abrir una solicitud de extracción como testaferro. 😏
Comentario más útil
¿Qué hay de malo en canalizar a un buscapersonas?