Moby: La salida predeterminada "docker ps" es demasiado ancha

Creado en 8 ago. 2014  ·  83Comentarios  ·  Fuente: moby/moby

screenshot 2014-08-07 16 27 38

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.

arecli exbeginner kinenhancement kinfeature

Comentario más útil

¿Qué hay de malo en canalizar a un buscapersonas?

docker ps | less -S

Todos 83 comentarios

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:

  • sin identificación porque los contenedores siempre tienen nombres
  • no creado, puedes inspeccionar para eso
  • Parece bastante útil conocer una descripción general de todos los puertos que están abiertos, pero ¿quizás esto podría descartarse?
  • el comando se puede truncar al ancho de la terminal, como /bin/ps

@bfirsh :

  • Por favor, no descarte los puertos, para mí son bastante útiles para ver rápidamente qué puertos están conectados a qué contenedor. Tener que inspeccionar cada contenedor es engorroso
  • ¿Qué hacer con --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
  • ¿Cuál será el orden de clasificación (predeterminado)? ¿Fecha de creación (no es lógica, ya que esa columna ya no está visible)? ¿Alfabéticamente en el nombre del contenedor?
  • Para futuras mejoras; permitir especificar qué columnas mostrar y ordenar (por ejemplo, --columns=a,f,g --sort=a,e
  • Para futuras mejoras; hacer que las columnas se muestren y ordenen configurables en un archivo de configuración
  • Para futuras mejoras; permitir configurar opciones de filtro predeterminadas (mostrar/no mostrar contenedores detenidos de forma predeterminada ( -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':

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

¿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 )

parné

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:

image

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:
screenshot from 2015-07-23 00 47 35

Y en una terminal de 137x24:
screenshot from 2015-07-23 00 49 35

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]'

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.

parné

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:

  • El nombre y la identificación para la mayoría de los usos tienen el mismo propósito, y tal podría eliminarse.
  • La fecha y hora de creación es probablemente algo con lo que estaría bien que se omitiera de la salida menos detallada
  • Personalmente, también estaría bien con la omisión de puertos de la salida menos detallada

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. 😏

¿Fue útil esta página
0 / 5 - 0 calificaciones