El titulo alternativo era “Dale docker, devolveme un objeto en vez de un montón de caracteres con un formato horrible, estamos en 2019!” pero me parecía demasiado largo.
Este ultimo tiempo estuve intentando migrar a un rol un poco mas divertido, mas dinámico, a lo que creo que es el siguiente paso para un administrador. DevOps.
La palabra resuena mucho por todos lados, todas las empresas quieren dinamismo, escalabilidad, resiliencia, o minimamente poder decir que tienen un equipo “cloud”.
Pero hoy no vengo a hablar de DevOps, ni de corporaciones, ni de laburo. Hoy me desperté con ganas de compartir una cosita muy muy chiquita que me llevó unas cuantas horas para armar (y probar, y putear, y aprender), que probablemente pueda ayudar a cualquier otra persona que empiece a meterse en estas tecnologías tan divertidas y novedosas
Cuestión que estaba haciendo un cursito de Docker en udemy, levantando containers a lo pavote, redirigiendo puertos, apuntando storage, un quilombo bárbaro. Súper súper divertido, todo muy dinámico, hasta que quise ordenar el output de docker ps -a y me di cuenta de lo malacostumbrado que me tiene Powershell.

Cuando uso cualquier cmdlet (get-sarasa) recibo un objeto como respuesta. Un hermoso objeto con propiedades, que puedo usar para filtrar, para ordenar, para listar, para re-usar, todo de manera ordenada, bella y hermosa <3.
Lamentablemente con docker no es el caso 🙁
Como toda herramienta con base linuxera, la respuesta viene en strings, cadenas de caracteres sin inteligencia propia, que un administrador experimentado probablemente sepa parsear muy fácil y rápido con algún comandito sencillo y 100% desconocido para mi (porque soy un windows boy y no tengo los huevos para migrar por ahora) ASI QUE se me ocurrió armar una función sencillita y rápida para dejar de sufrir y poder matar containers sin tener que escribir mucho 😀
Asi que les presento ConvertFrom-DockerPS.
function ConvertFrom-DockerPS { | |
<# | |
.SYNOPSIS | |
Parses docker ps output to make it more readable | |
.DESCRIPTION | |
Pipe the results of Docker ps to this function and get the results in a nice, more powershelly format | |
.PARAMETER | |
.EXAMPLE | |
docker ps | ConvertFrom-DockerPS | select names, image, "container id", created # Get all running containers | |
docker ps -a | ConvertFrom-DockerPS | where {$_.status -like "exited*"} | docker # Get all closed containers | |
docker ps -a | ConvertFrom-DockerPS | where {$_.status -like "exited*"} | foreach { docker rm $_.'CONTAINER ID' } # remove all stopped containers | |
.NOTES | |
The core of the code was taken from https://www.reddit.com/r/PowerShell/comments/8p09mb/how_to_loop_through_docker_ps_a_with_powershell/ so | |
credits go to reddit user /u/Lee_Dailey (https://www.reddit.com/user/Lee_Dailey/), a great contributor on the powershell subreddit [grin] | |
I've also (forcefully) learned the how's and why's of using advanced functions, and the massive value of the ISE (which i will never use again, heh) | |
Thank you fellow admin for reading this ramblings, and party on! | |
#> | |
[CmdletBinding()] | |
param( | |
[Parameter(ValueFromPipeline=$true)]$adentro | |
) | |
begin{ | |
#Declare the $final helper object | |
$final=@() | |
} | |
process{ | |
$InStuff = $adentro.Split("`n").Trim("`r") | |
$OutStuff = $InStuff -replace '\s{23,}', ',,' -replace '\s{2,}', ',' | |
#Added this to mitigate an issue with formatting on the ugly header | |
if ($OutStuff -like "*IMAGE,COMMAND,*") { $OutStuff= $OutStuff.replace(',,',',')} | |
$final+=$OutStuff | |
} | |
end{ | |
#Convert it all to CSV and send it back | |
$final | ConvertFrom-Csv | |
} | |
} |

Y ahora los dejo, que estoy súper manija con este curso, si tienen la oportunidad chusmeenlo, que esta muy bien explicado y tiene ejercicios concretos, una plataforma online para poder hacer (casi) todo sin instalar nada, y honestamente creo que el futuro de la administración de sistemas viene por este lado.
Hasta la próxima!