¿Alguna vez te has encontrado en un servidor con decenas de contenedores corriendo y no recuerdas exactamente dónde está el archivo docker-compose.yml de uno de ellos?
Docker Compose inyecta etiquetas (labels) en los contenedores al crearlos, pero consultarlas manualmente con docker inspect es un proceso lento. Para solucionar esto, hice un pequeño script en Bash que utiliza fzf para seleccionar el contenedor y mostrarte toda su info relevante al instante.
📺 Miralo en acción
El Script: fcompose.sh
Este script permite:
Selección interactiva con fzf de contenedores en ejecución.
Vista previa (Preview) de redes, IPs, mapeo de puertos y volúmenes montados.
Ruta absoluta del archivo YAML que define al contenedor.
#!/bin/bash
# Función para obtener la ruta del YAML desde las etiquetas de Docker
get_compose_path() {
local target=$1
docker inspect --format '{{ index .Config.Labels "com.docker.compose.project.config_files" }}' "$target" 2>/dev/null
}
if [ -z "$1" ]; then
# Comando de preview con colores para visibilidad
PREVIEW_CMD="echo -e '\e[1;36m--- REDES ---\e[0m'; \
docker inspect {1} --format '{{range \$net, \$conf := .NetworkSettings.Networks}}- {{ \$net }} ({{ \$conf.IPAddress }}){{println}}{{end}}'; \
echo -e '\n\e[1;36m--- PUERTOS (Host -> Contenedor) ---\e[0m'; \
docker inspect {1} --format '{{range \$p, \$conf := .NetworkSettings.Ports}}{{range \$conf}}{{ .HostIp }}:{{ .HostPort }} -> {{ \$p }}{{println}}{{end}}{{else}}Sin puertos mapeados{{end}}'; \
echo -e '\n\e[1;36m--- VOLÚMENES ---\e[0m'; \
docker inspect {1} --format '{{range .Mounts}}- {{.Source}} -> {{.Destination}}{{println}}{{end}}'"
SELECTION=$(docker ps --format "{{.Names}}" | fzf \
--height 80% \
--reverse \
--header "Contenedores activos | Enter para ver ruta YAML" \
--preview "$PREVIEW_CMD" \
--preview-window=right:65%:wrap)
if [ -z "$SELECTION" ]; then
exit 0
fi
CONTAINER_NAME=$SELECTION
else
CONTAINER_NAME=$1
fi
COMPOSE_PATH=$(get_compose_path "$CONTAINER_NAME")
if [ -z "$COMPOSE_PATH" ]; then
echo -e "\n\033[1;31m[!] El contenedor '$CONTAINER_NAME' no tiene etiquetas de Docker Compose.\033[0m"
exit 1
else
SEPARATOR="\033[1;36m------------------------------------------------------------\033[0m"
echo -e "\n\033[1;32m✔ Contenedor:\033[0m $CONTAINER_NAME"
echo -e "\033[1;34m✔ Archivo YAML:\033[0m $COMPOSE_PATH"
echo -e "\n$SEPARATOR"
echo -e "\033[1;33mResumen de Red y Puertos:\033[0m"
docker inspect --format 'Redes: {{range $net, $v := .NetworkSettings.Networks}}{{$net}} ({{$v.IPAddress}}) {{end}}
Puertos: {{range $p, $conf := .NetworkSettings.Ports}}{{range $conf}}{{.HostIp}}:{{.HostPort}}->{{$p}} {{end}}{{end}}' "$CONTAINER_NAME"
echo -e "$SEPARATOR\n"
fi
Cómo usarlo
Guarda el código como fcompose.sh.
Dale permisos: chmod +x fcompose.sh.
(Opcional) Muévelo a tu path: sudo mv fcompose.sh /usr/local/bin/fcompose.
¡Corre fcompose y disfruta!
Requisitos
fzf: El motor de búsqueda difusa.
Docker: ¡Obviamente!
Espero que les sirva tanto como a mí para administrar servidores con muchos microservicios. ¡Cualquier mejora es bienvenida en los comentarios!
Top comments (1)
update
Actualización