2 Punkte von GN⁺ 2025-04-11 | 1 Kommentare | Auf WhatsApp teilen
  • Ein modernisierter Ersatz für das bisherige dockfmt, der Dockerfiles automatisch bereinigt und den Code-Stil vereinheitlicht
  • Verwendet intern buildkit zur Analyse der Dockerfile-Syntax und mvdan/sh zum Formatieren von Shell-Skripten innerhalb von RUN-Befehlen
  • Hilft dabei, einen konsistenten Code-Stil beizubehalten, und kann in Code-Reviews sowie CI-Umgebungen nützlich eingesetzt werden

Verwendung

dockerfmt [Dockerfile] [flags]  
dockerfmt [command]  
  • Wichtige Befehle:
    • completion: Generiert Shell-Autovervollständigungs-Skripte
    • help: Hilfe zu Befehlen
    • version: Gibt die Version aus
  • Wichtige Flags:
    • -c, --check: Prüft nur, ob Formatierung erforderlich ist
    • -i, --indent: Legt die Anzahl der Einrückungs-Leerzeichen fest (Standardwert 4)
    • -n, --newline: Fügt am Dateiende einen Zeilenumbruch hinzu
    • -s, --space-redirects: Fügt nach Umleitungsoperatoren Leerzeichen ein
    • -w, --write: Überschreibt die Originaldatei mit den geänderten Inhalten

Pre-commit-Hook-Konfiguration

  • Kann als pre-commit-Hook integriert werden
  • Beispiel für die Datei .pre-commit-config.yaml:
    repos:  
      - repo: https://github.com/reteps/dockerfmt  
        rev: main  
        hooks:  
          - id: dockerfmt  
            args:  
              - --indent=4  
    

Aktuelle Einschränkungen

  • Semikolons (;) oder Befehlsgruppierungen in RUN-Befehlen werden derzeit noch nicht unterstützt
  • Keine automatische Zeilenumbruch-Funktion für lange JSON-Befehle
  • Die Direktive # escape=X wird nicht unterstützt

Funktionsübersicht

  • Nutzt mvdan/sh beim Formatieren von RUN-Befehlen

  • Grundlegende heredoc-Unterstützung:

    RUN <<EOF  
    echo "hello"  
    echo "world"  
    EOF  
    
  • Unterstützung für Kommentare innerhalb von RUN-Befehlen:

    RUN echo "hello" \  
        # this is a comment  
        && echo "world"  
    
    RUN echo "hello" \  
        # this is a comment  
        # that spans multiple lines  
        && echo "world"  
    
  • Es wird versucht sicherzustellen, dass Kommentare an der korrekt formatierten Position angehängt werden, was jedoch schwierig ist, da Kommentare im Parser-Schritt entfernt werden

JS-Bindings

  • Die JS-Bindings sind im Verzeichnis js enthalten
  • Die Verwendung ist in js/README.md beschrieben

Sonstige Hinweise

  • Da es sich noch um eine Version vor 1.0.0 handelt, wird der Einsatz in Produktionsumgebungen derzeit nicht empfohlen

1 Kommentare

 
GN⁺ 2025-04-11
Hacker-News-Kommentare
  • Ich musste lachen, als ich in den Quellen nachgesehen habe und kein Dockerfile finden konnte. Der einfachste Weg wäre gewesen, das Ganze für eine bestehende Datei in einem Docker-Container laufen zu lassen, aber leider ging das nicht
  • Ich möchte den markierten und gelöschten Kommentar nicht verteidigen. Er wurde vermutlich wegen seines Tons gelöscht, zeigt aber ziemlich gut, dass dieses Produkt kein QA durchlaufen hat
  • Wenn dein Projekt-Root nicht 50 Dotfiles für Formatter, Package-Manager, Linter und CI hat, bist du kein echter Software Engineer
    • Ich frage mich, wer eigentlich die Formatter-Konfigurationsdatei formatiert
  • Ich war überrascht zu sehen, dass der RUN-Parser keine Gruppierung oder Semikolons in Befehlen unterstützt
    • Ich bevorzuge es, so zu schreiben
    • RUN set -e ;\ export DEBIAN_FRONTEND=noninteractive ;\ etc etc
    • Daher scheint dieses Tool nichts für mich zu sein
  • Es heißt, der RUN-Parser unterstütze keine Gruppierung oder Semikolons in Befehlen, aber im Beispiel wird gezeigt, dass && unterstützt wird. Ich frage mich, warum es da einen Unterschied gibt
    • Normalerweise schreibe ich so
    • RUN foo && \ bar && \ :
    • Das wirkt syntaktisch identisch zu
    • RUN set -e && \ foo ; \ bar ; \ :
  • Ich würde in Multi-Stage-Dockerfiles gern den Body jeder Stage einrücken
    • FROM foo ... FROM bar ...
    • So lässt sich auf einen Blick leichter erkennen, was passiert
  • Ich frage mich, wie mit Multi-Stage-Dockerfiles umgegangen wird. Ich rücke die Schritte nach FROM immer ein, um die Stages klarer zu machen. Für mich wäre es so, als würde man in anderen Sprachen Funktionskörper nicht einrücken
  • Ich frage mich, ob es eine Möglichkeit gibt, Docker-Dateien zu schichten. Ich meine nicht Compose, sondern eine gute Art, die Layer anderer Docker-Dateien zu kombinieren
  • Ich hoffe, dass es für dockerfmt eine Konfigurationsdatei geben wird. Mit der Zeit werden immer mehr Optionen hinzukommen. Irgendwann erreicht es Turing-Vollständigkeit
    • Dann braucht man einen Formatter für den Formatter
    • Wie Shrek zu Donkey sagte: Software ist wie eine Zwiebel
  • Ich verwende yaml LSP. Wahrscheinlich würde ich versuchen, das Containerfile-Format von schema.org nachzuschlagen. Darauf bin ich erst kürzlich bei der Arbeit mit Github-Actions-YAML-Dateien gestoßen. Ziemlich nützlich