DEV Community

Cover image for Encuentra tu archivo YAML de Docker Compose en segundos con fzf. 🚀
Horacio Degiorgi
Horacio Degiorgi

Posted on

Encuentra tu archivo YAML de Docker Compose en segundos con fzf. 🚀

¿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.
Enter fullscreen mode Exit fullscreen mode
#!/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
Enter fullscreen mode Exit fullscreen mode

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!
Enter fullscreen mode Exit fullscreen mode

Requisitos

fzf: El motor de búsqueda difusa.

Docker: ¡Obviamente!
Enter fullscreen mode Exit fullscreen mode

Link

Espero que les sirva tanto como a mí para administrar servidores con muchos microservicios. ¡Cualquier mejora es bienvenida en los comentarios!

docker #devops #bash #linux #productivity

Top comments (1)

Collapse
 
horaciodegiorgi profile image
Horacio Degiorgi