Docker enchulame la lista de contenedores
 
  Agosto 1, 2020

Siempre que ejecuto docker ps para listar los contenedores me resulta difícil entender donde inicia y donde termina la información sobre cada contenedor:



¡Que carajos! ... el puerto ¿cúal? ... siento que casi estoy viendo la matrix

Debo admitir que después de un tiempo tus ojos se acostumbran y comienzan a hacer cosas raras pero comienzas a entender el resultado. Claro que no debería ser así, por lo que encontré que tenemos algunas opciones para mejorar el resultado.

Utilizar —format

Al utilizar la opción --format, podemos elegir de una serie campos disponibles e incluso despegarlos de forma mas ordenada usando la sintaxis table {{.FieldName}}\t. La opción format utiliza Go templates algo que me resulta familiar1.

table incluye los encabezados y \t agrega espacio entre las columnas.

 Ejemplo usando --format

docker ps --format 'table {{.Names}}\t
                          {{.Status}} : {{.RunningFor}}\t
                          {{.ID}}\t
                          {{.Image}}'

Y obtenemos esto:

Definitivamente resulta mucho más fácil de comprender

Sacando provecho a los Go Templates

Nos podemos poner creativos y si necesitamos por ejemplo consultar los contenedores con información de red utilicemos las características de los GoLang Templates para detectar si hay puertos y desplegarlos en cada linea:

 Información de red

docker ps --format 'table {{.Names}}
                          \t{{.Status}}
                          \t{{.Networks}}
                          \n{{.ID}}
                          {{if .Ports}}
                            {{with $p := split .Ports ", "}}
                              {{range $p}}\t\t{{println .}}{{end}}
                            {{end}}
                          {{else}}
                            \t\t{{println "No Ports"}}
                          {{end}}'

Como ven mucho mejor ordenado en dos columnas y con todos los datos de la red y puertos mas legibles

Todos los containers docker ps –a

Podemos revisar todos los contenedores (activos y no activos) utilizando la opción -a. Aprovechando los templates añadamos el tamaño en disco, como utiliza la red y la imagen de donde proviene el contenedor.

 Información de todos los contenedores

docker ps -a -q --format 'table {{.Names}}\t
                                {{.Status}}\t
                                {{.Size}}\n
                                {{.ID}}\t
                                {{.Image}}
                                {{if .Ports}}
                                  {{with $p := split .Ports ", "}}\t
                                    {{len $p}} port(s) on {{end}}{{- .Networks}}
                                  {{else}}\tNo Ports on {{ .Networks }}
                                {{end}}\n'


De esta manera podemos ver en general el estado de nuestros contenedores.

Crear una función para reutilizar los comandos

Finalmente podemos crear una función para utilizar estos comandos (si estas utilizando WSL o Linux) dentro de nuestro .bash_aliases

 Crear una función bash que acepta parámetros

# Docker PS Prettify Function
function dock() {
  if [[ "$@" == "ps" ]]; then
    command docker ps --format 'table {{.Names}}\t{{.Status}} : {{.RunningFor}}\t{{.ID}}\t{{.Image}}'
  elif [[ "$@" == "psa" ]]; then
    # docker ps -a includes all containers
    command docker ps -a --format 'table {{.Names}}\t{{.Status}}\t{{.Size}}\n{{.ID}}\t{{.Image}}{{if .Ports}}{{with $p := split .Ports ", "}}\t{{len $p}} port(s) on {{end}}{{- .Networks}}{{else}}\tNo Ports on {{ .Networks }}{{end}}\n'
  elif [[ "$@" == "psnet" ]]; then
    # docker ps with network information
    command docker ps -a --format 'table {{.Names}}\t{{.Status}}\t{{.Networks}}\n{{.ID}}{{if .Ports}}{{with $p := split .Ports ", "}}{{range $p}}\t\t{{println .}}{{end}}{{end}}{{else}}\t\t{{println "No Ports"}}{{end}}'
  else
    command docker "$@"
  fi
}

Para utilizarlo basta ahora con teclear:

dock ps
Contenedores en ejecución con su imagén
dock psa
Todos los contenedores incluyendo tamaño en disco y datos de red
dock psnet
Contenedores en ejecución con información de red

Campos disponibles en docker

.ID
Identificador del contenedor
.Image
Id de la imagén
.Command
Comando de ejecución
.CreatedAt
Tiempo cuando el contenedor se creó.
.RunningFor
Tiempo transcurrido desde que se inició el contenedor.
.Ports
Puertos utilizados por el contenedor.
.Status
Estado del contenedor.
.Size
Espacio que ocupa en disco el contenedor.
.Names
Nombre del contenedor.
.Labels
Todas las etiquetas asignadas al contenedor.
.Label
Valor especifico para una etiqueta. Por ejemplo ‘{{.Label “com.docker.swarm.cpu”}}’
.Mounts
Nombre de los volúmenes montados en este contenedor.
.Networks
Nombre de las redes adjuntas al contenedor.

  1. Este blog esta desarrollado con HUGO, el cual a su vez usa GoLang html y text templates. ↩︎