Configura formato de docker ps y sé más productivo

Photo by Ian Taylor on Unsplash

En este artículo te mostraré cómo puedes personalizar el formato que produce el comando docker ps. Para esto he usado Ubuntu 18.04 y 20.04.

Si usas Docker con frecuencia, probablemente el comando que más utilizas es docker ps, que genera un output del siguiente estilo:

CONTAINER ID   IMAGE                    COMMAND                  CREATED        STATUS        PORTS                                                    NAMES
30efae594890   mysql:5.7                "docker-entrypoint.s…"   3 months ago   Up 3 months   33060/tcp, 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mysql_5.7

Cuál es el problema?

Qué problemas tiene este formato que aparece por defecto?

  1. Es muy ancho: Este ejemplo tiene 159 caracteres, lo que es demasiado para la mayoría de monitores y terminales que usamos a diario.
  2. Pésima legibilidad: Debido a la cantidad de caracteres (en especial por la columna PORTS), cada linea se divide en varias y hace difícil interpretar rápidamente el resultado.
  3. No todas las columnas son relevantes para tí: Puede que no te interese conocer la columna COMMAND o CREATED.

Los anteriores problemas aparecen incluso viendo un solo contenedor ejecutándose. Todo empeora si tienes muchos contenedores en la lista.

Solucion provisional

Una solución provisional es personalizar el formato del output del comando docker ps con la opción --format. Algunas características de esta solución:

  1. Puedes elegir cuántas y cuáles columnas quieres mostrar: Además de las opciones por defecto puedes mostrar el tamaño del contenedor, los volúmenes montados, las redes a las que está conectado, etc. Ver el listado documentación.
  2. Puedes elegir el formato: Puedes tener simplemente el listado de campos elegidos con el formato que tú le des o que docker automáticamente formatee como una tabla con las columnas elegidas y sus títulos respectivos.

Ejemplo:

El siguiente comando muestra una fila por cada contenedor, con los campos ID y COMMAND. Se trata de un string donde cada columna se representa mediante corchetes dobles y su identificador (que comienza siempre con un punto). Cada elemento columna se puede rodear de cualquier caracter que desees, como tabs (\t), espacios, comas, dos puntos, incluso breaklines (\n).

$ docker ps --format "{{.ID}}: {{.Command}}"

a87ecb4f327c: /bin/sh -c #(nop) MA
01946d9d34d8: /bin/sh -c #(nop) MA
c1d3b0166030: /bin/sh -c yum -y up
41d50ecd2f57: /bin/sh -c #(nop) MA

Este método es bueno cuando quieres cierta información una sola vez o quizás si quieres incrustarlo en un pipe de BASH para ejecutar algún comando o script de automatización.

Sin embargo, se vuelve tedioso si vas a usarlo de manera interactiva con mucha frecuencia en la terminal (especialmente si tienes muchas columnas).

Solución permanente

La solución permanente consiste en crear un archivo config.json dentro de una carpeta llamada .docker. Esta carpeta debe estar en la carpeta de inicio del usuario actual.

En dicho archivo config.json se creará un objeto json cuyo elemento tenga la llave “psFormat” y el valor sea el string con el formato elegido.

Ejemplo

El siguiente es un ejemplo del contenido del archivo ~/.docker/config.json.

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

Una vez hayas editado y guardado el archivo config.json, ya puedes usar el comando por defecto docker ps. Obtendrás el output con el formato que configuraste. En este ejemplo, se produce el siguiente output:

CONTAINER ID        LABELS
a87ecb4f327c          com.docker.swarm.node=ubuntu,com.docker.swarm.storage=ssd
c1d3b0166030         com.docker.swarm.node=debian,com.docker.swarm.cpu=6
41d50ecd2f57          com.docker.swarm.node=fedora,com.docker.swarm.cpu=3

Formatos que he creado para mí

A continuación comparto dos formatos que he creado:

  1. Formato Simplificado: muestra la información más básica, ocupa poco espacio. Lo configuré como formato predeterminado para docker ps, siguiendo los pasos mencionados.
  2. Formato detallado: muestra mucha más información de los contenedores, separándolos en secciones y dando un formato especial a los puertos para mejorar la legibilidad.

Formato simplificado

Datos para mostrar:

  • Nombre de contenedor
  • Nombre de imágen
  • Estado actual y tiempo que lleva funcionando
  • Tiempo transcurrido desde creación de contenedor

Resultado:

Para obtener este formato, he ubicado el siguiente string en archivo config.json (siguiendo las instrucciones ya descritas):

"table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}\t{{.RunningFor}}"

Formato detallado

Datos para mostrar:

  • ID de contenedor
  • Imágen
  • Tiempo transcurrido desde creación de contenedor
  • Estado actual y tiempo que lleva funcionando
  • Comando de inicio
  • Tamaño
  • Bind mounts
  • Redes asociadas
  • Listado de asignación de puertos (host –> contenedor), cada uno en una línea

Resultado:

Como este no lo uso tan frecuentemente, lo he guardado en un script de bash, por ejemplo, comando.sh y asociado a un alias en mi archivo ~/.bash_aliases. De esta manera, solo necesito utilizar el alias para ejecutar este comando completo:

docker ps --format "{{.Names}}\n\tContainer ID:\t{{.ID}}\n\tImage ID:\t{{.Image}}\n\tCreated:\t{{.RunningFor}}\n\tStatus:\t\t{{.Status}}\n\tCommand:\t{{.Command}}\n\tSize:\t\t{{.Size}}\n\tMounts:\t\t{{.Mounts}}\n\tNetworks:\t{{.Networks}}\n\tPorts:\t\t{{.Ports}}\n" | sed -e 's/, /\n\t\t\t/g' | sed -e 's/->/ --> /g' | sed -e 's/,/\n\t\t\t/g'

Te invito a probarlos. Seguramente podrás agilizar tu trabajo y personalizarlos aún más.

Leave a Reply

Your email address will not be published. Required fields are marked *