2 puntos por GN⁺ 2025-04-11 | 1 comentarios | Compartir por WhatsApp
  • Una alternativa modernizada al dockfmt original, que organiza automáticamente los Dockerfile y unifica el estilo del código
  • Internamente usa buildkit para analizar la sintaxis de Dockerfile y mvdan/sh para formatear scripts de shell dentro de comandos RUN
  • Ayuda a mantener un estilo de código consistente y puede ser útil en revisiones de código y entornos de CI

Uso

dockerfmt [Dockerfile] [flags]  
dockerfmt [command]  
  • Comandos principales:
    • completion: genera scripts de autocompletado para el shell
    • help: ayuda de comandos
    • version: muestra la versión
  • Flags principales:
    • -c, --check: solo verifica si necesita formateo
    • -i, --indent: configura la cantidad de espacios de indentación (predeterminado: 4)
    • -n, --newline: agrega un salto de línea al final del archivo
    • -s, --space-redirects: agrega un espacio después de los operadores de redirección
    • -w, --write: sobrescribe el archivo original con los cambios

Configuración de hook de pre-commit

  • Se puede integrar como hook de pre-commit
  • Ejemplo de archivo .pre-commit-config.yaml:
    repos:  
      - repo: https://github.com/reteps/dockerfmt  
        rev: main  
        hooks:  
          - id: dockerfmt  
            args:  
              - --indent=4  
    

Limitaciones actuales

  • En los comandos RUN todavía no se admiten el punto y coma (;) ni la agrupación de comandos
  • No hay función de salto de línea automático para comandos JSON largos
  • La directiva # escape=X no es compatible

Presentación de funciones

  • Usa mvdan/sh al formatear comandos RUN

  • Soporte básico para heredoc:

    RUN <<EOF  
    echo "hello"  
    echo "world"  
    EOF  
    
  • Soporte para comentarios dentro de comandos RUN:

    RUN echo "hello" \  
        # this is a comment  
        && echo "world"  
    
    RUN echo "hello" \  
        # this is a comment  
        # that spans multiple lines  
        && echo "world"  
    
  • Intenta hacer que los comentarios queden correctamente adjuntos a la posición formateada, pero esto es difícil porque los comentarios se eliminan en la etapa del parser

Bindings de JS

  • Los bindings de JS están incluidos en el directorio js
  • El modo de uso puede consultarse en js/README.md

Otras notas

  • Como todavía es una versión anterior a 1.0.0, no se recomienda su uso en producción

1 comentarios

 
GN⁺ 2025-04-11
Comentarios de Hacker News
  • Me dio risa ver el código fuente y no poder encontrar el Dockerfile. La forma más fácil de ejecutarlo sería con un contenedor de Docker sobre el archivo existente, pero lamentablemente no se podía
  • No quiero apoyar el comentario marcado y eliminado. Probablemente lo borraron por el tono, pero muestra muy bien que este producto no pasó por QA
  • Si en la raíz del proyecto no tienes 50 archivos ocultos para el formateador, el gestor de paquetes, el linter y el CI, entonces no eres un verdadero ingeniero de software
    • Me pregunto quién formatea el archivo de configuración del formateador
  • Me sorprendió ver que el parser de RUN no soporta agrupación ni punto y coma en los comandos
    • Yo prefiero escribirlo así
    • RUN set -e ;\ export DEBIAN_FRONTEND=noninteractive ;\ etc etc
    • Así que esta herramienta no parece ser para mí
  • Dicen que el parser de RUN no soporta agrupación ni punto y coma en los comandos, pero en el ejemplo muestran que sí soporta &&. Me pregunto por qué la diferencia
    • Yo normalmente lo escribo así
    • RUN foo && \ bar && \ :
    • Eso parece ser sintácticamente equivalente a lo siguiente
    • RUN set -e && \ foo ; \ bar ; \ :
  • Quiero poder indentar el cuerpo de cada etapa en un Dockerfile multi-stage
    • FROM foo ... FROM bar ...
    • Así es fácil ver de un vistazo qué está pasando
  • Me pregunto cómo maneja los Dockerfiles multi-stage. Yo siempre indento los pasos después de FROM para hacer más clara cada etapa. Me parece que no hacerlo es como no indentar el cuerpo de una función en otros lenguajes
  • Me pregunto si hay una forma de componer Dockerfiles en capas. No me refiero a Compose, sino a una buena manera de combinar capas de distintos Dockerfiles
  • Ojalá haya un archivo de configuración para dockerfmt. Con el tiempo le irán agregando más y más opciones. Al final llegará a ser Turing completo
    • Entonces hará falta un formateador para el formateador
    • Como Shrek le dijo a Donkey, el software es como una cebolla
  • Yo uso yaml LSP. Probablemente intentaría consultar el formato Containerfile de schema.org. Lo descubrí por primera vez hace poco mientras trabajaba con archivos yaml de GitHub Actions. Es bastante útil