A ver, seamos sinceros. Cuando necesitas sacar un dato específico de un comando de consola, la primera herramienta que viene a la cabeza es grep, ¿verdad? Es como el comodín del shell, siempre te saca de apuros. Pero cuando se trata de obtener la dirección IP de un contenedor Docker para automatizar procesos, usar grep no es la mejor idea.
De hecho, es una de esas cosas que me costó entender al principio. Uno ve la salida de docker inspect, un JSON largo, y piensa «fácil, busco la línea de IPAddress y listo». El problema es que esta forma es frágil. Si Docker cambia un poco el formato de su salida, o si aparece otra línea con 'IPAddress' en algún otro contexto dentro del JSON, tu script se rompe. Y en mi caso, que he tenido que armar scripts para despliegues personalizados, eso es una lata.
La solución que yo uso, y que es mucho más robusta, es aprovechar el comando docker inspect al máximo. Este comando no solo te muestra toda la información del contenedor, sino que te permite formatearla a tu gusto usando plantillas de Go. Es como tener un mini-parser JSON integrado, pero pensado para la consola.
Aquí te va el comando que necesitas:
docker inspect \
-f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
¿Por qué esta forma es mejor? Primero, es precisa. Le estás diciendo a Docker exactamente dónde ir a buscar el dato: dentro de NetworkSettings, luego en la lista de Networks, y de ahí, la IPAddress. No hay ambigüedad. Segundo, es mucho menos propenso a errores. El formato de salida es el que tú defines, no dependes de cómo Docker elija mostrar su JSON por defecto.
Algunos podrían decir que igual sirve un docker inspect | grep "IPAddress" | awk ... para extraer la línea, y sí, claro que "sirve". Pero no es lo mismo que tener la certeza de que tu script va a seguir funcionando aunque el output de inspect cambie en detalles irrelevantes para ti. Además, ojo que si usas Windows, la sintaxis con comillas simples o dobles puede variar y te va a dar un dolor de cabeza extra si intentas hacer un grep.
Siempre prefiero ir por la solución más directa y oficial que te dan las herramientas. Me ahorra tiempo y dolores de cabeza a futuro. De verdad, usar el --format de docker inspect es una de esas cosas que, en retrospectiva, ojalá hubiera aprendido y aplicado mucho antes en mis primeros años de desarrollo, especialmente cuando uno empieza a automatizar con Docker.