2 points par GN⁺ 2025-04-11 | 1 commentaires | Partager sur WhatsApp
  • Outil de remplacement modernisé de dockfmt, qui réorganise automatiquement les Dockerfile et harmonise leur style de code
  • Utilise en interne buildkit pour l'analyse syntaxique des Dockerfile, et mvdan/sh pour le formatage des scripts shell dans les commandes RUN
  • Permet de conserver un style de code cohérent et peut être utile pour la revue de code ainsi que dans les environnements CI

Utilisation

dockerfmt [Dockerfile] [flags]  
dockerfmt [command]  
  • Commandes principales :
    • completion : génère un script d'autocomplétion pour le shell
    • help : aide sur les commandes
    • version : affiche la version
  • Principaux flags :
    • -c, --check : vérifie uniquement si un formatage est nécessaire
    • -i, --indent : définit le nombre d'espaces d'indentation (valeur par défaut : 4)
    • -n, --newline : ajoute un saut de ligne à la fin du fichier
    • -s, --space-redirects : ajoute un espace après les opérateurs de redirection
    • -w, --write : écrase le fichier d'origine avec le contenu modifié

Configuration du hook pre-commit

  • Peut être intégré comme hook pre-commit
  • Exemple de fichier .pre-commit-config.yaml :
    repos:  
      - repo: https://github.com/reteps/dockerfmt  
        rev: main  
        hooks:  
          - id: dockerfmt  
            args:  
              - --indent=4  
    

Limitations actuelles

  • Les points-virgules (;) et le groupement de commandes dans les commandes RUN ne sont pas encore pris en charge
  • Pas de fonctionnalité de retour automatique à la ligne pour les longues commandes JSON
  • La directive # escape=X n'est pas prise en charge

Présentation des fonctionnalités

  • Utilise mvdan/sh pour le formatage des commandes RUN

  • Prise en charge de base des heredoc :

    RUN <<EOF  
    echo "hello"  
    echo "world"  
    EOF  
    
  • Prise en charge des commentaires dans les commandes RUN :

    RUN echo "hello" \  
        # this is a comment  
        && echo "world"  
    
    RUN echo "hello" \  
        # this is a comment  
        # that spans multiple lines  
        && echo "world"  
    
  • Tente de conserver les commentaires correctement attachés à leur emplacement formaté, mais cela reste difficile car les commentaires sont supprimés à l'étape du parsing

Binding JS

  • Le binding JS est inclus dans le répertoire js
  • Le mode d'emploi est disponible dans js/README.md

Autres remarques

  • Le projet étant encore en version antérieure à 1.0.0, son utilisation en production n'est pas recommandée

1 commentaires

 
GN⁺ 2025-04-11
Commentaires sur Hacker News
  • J’ai éclaté de rire en regardant le code source et en ne trouvant aucun Dockerfile. La façon la plus simple de l’exécuter sur un fichier existant aurait été via un conteneur Docker, mais malheureusement ce n’était pas possible
  • Je ne veux pas soutenir le commentaire signalé puis supprimé. Il a probablement été supprimé à cause de son ton, mais il montre bien que ce produit n’a pas bénéficié de QA
  • S’il n’y a pas 50 fichiers de config cachés à la racine du projet pour le formateur, le gestionnaire de paquets, le linter et la CI, alors vous n’êtes pas un vrai ingénieur logiciel
    • Je me demande qui formate le fichier de configuration du formateur
  • J’ai été surpris de voir que le parseur de RUN ne prend pas en charge les groupements ni les points-virgules dans les commandes
    • Je préfère écrire de cette façon
    • RUN set -e ;\ export DEBIAN_FRONTEND=noninteractive ;\ etc etc
    • Donc cet outil ne semble pas me convenir
  • On dit que le parseur de RUN ne prend pas en charge les groupements ni les points-virgules dans les commandes, mais l’exemple montre qu’il prend en charge &&. Je me demande d’où vient cette différence
    • En général, j’écris comme ceci
    • RUN foo && \ bar && \ :
    • Ce qui semble syntaxiquement équivalent à ceci
    • RUN set -e && \ foo ; \ bar ; \ :
  • Dans un Dockerfile multi-stage, j’aimerais indenter le corps de chaque étape
    • FROM foo ... FROM bar ...
    • Cela permet de voir facilement ce qui se passe d’un seul coup d’œil
  • Je me demande comment il gère les Dockerfiles multi-stage. J’indente toujours les étapes après FROM pour rendre chaque stage plus clair. Ne pas le faire me paraît équivalent à ne pas indenter le corps d’une fonction dans d’autres langages
  • Je me demande s’il existe un moyen de superposer des fichiers Docker. Je ne parle pas de Compose, mais d’une bonne manière de combiner des couches provenant d’autres Docker
  • J’aimerais qu’il y ait un fichier de configuration pour dockerfmt. Avec le temps, il y aura de plus en plus d’options. À la fin, on atteindra la complétude de Turing
    • Et il faudra alors un formateur pour le formateur
    • Comme Shrek l’a dit à l’Âne, le logiciel, c’est comme un oignon
  • J’utilise le LSP YAML. Il essaiera probablement de consulter le format Containerfile de schema.org. Je l’ai découvert pour la première fois récemment en travaillant sur des fichiers YAML de GitHub Actions. C’est plutôt utile