2 पॉइंट द्वारा GN⁺ 2025-04-11 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • यह मौजूदा dockfmt का आधुनिक विकल्प है, जो Dockerfile को अपने आप व्यवस्थित करता है और code style को एकसमान बनाता है
  • अंदरूनी तौर पर Dockerfile syntax parsing के लिए buildkit और RUN कमांड के भीतर shell script formatting के लिए mvdan/sh का उपयोग करता है
  • यह consistent code style बनाए रखने में मदद करता है और code review तथा CI environment में उपयोगी हो सकता है

उपयोग

dockerfmt [Dockerfile] [flags]  
dockerfmt [command]  
  • मुख्य कमांड:
    • completion: shell auto-completion script बनाता है
    • help: कमांड सहायता
    • version: version दिखाता है
  • मुख्य flags:
    • -c, --check: केवल यह जांचता है कि formatting की ज़रूरत है या नहीं
    • -i, --indent: indentation spaces की संख्या सेट करता है (default 4)
    • -n, --newline: फ़ाइल के अंत में newline character जोड़ता है
    • -s, --space-redirects: redirection operator के बाद space जोड़ता है
    • -w, --write: बदली हुई सामग्री को मूल फ़ाइल पर overwrite करता है

Pre-commit hook सेटअप

  • इसे pre-commit hook के रूप में integrate किया जा सकता है
  • .pre-commit-config.yaml फ़ाइल का उदाहरण:
    repos:  
      - repo: https://github.com/reteps/dockerfmt  
        rev: main  
        hooks:  
          - id: dockerfmt  
            args:  
              - --indent=4  
    

मौजूदा सीमाएँ

  • RUN कमांड में semicolon (;) या command grouping अभी समर्थित नहीं हैं
  • लंबे JSON कमांड के लिए automatic line wrapping उपलब्ध नहीं है
  • # escape=X directive समर्थित नहीं है

फीचर परिचय

  • RUN कमांड formatting के लिए mvdan/sh का उपयोग करता है

  • basic heredoc support:

    RUN <<EOF  
    echo "hello"  
    echo "world"  
    EOF  
    
  • RUN कमांड के भीतर comments का support:

    RUN echo "hello" \  
        # this is a comment  
        && echo "world"  
    
    RUN echo "hello" \  
        # this is a comment  
        # that spans multiple lines  
        && echo "world"  
    
  • यह comments को formatted position पर सही तरह से जोड़ने की कोशिश करता है, लेकिन parser stage में comments हट जाने के कारण यह कठिन है

JS binding

  • JS binding js directory में शामिल है
  • उपयोग का तरीका js/README.md में देखा जा सकता है

अन्य संदर्भ

  • यह अभी 1.0.0 से पहले का version है, इसलिए production environment में इसका उपयोग अनुशंसित नहीं है

1 टिप्पणियां

 
GN⁺ 2025-04-11
Hacker News की राय
  • source code देखा, लेकिन Dockerfile नहीं मिला, तो हंसी आ गई। मौजूदा फ़ाइल पर इसे Docker container के रूप में चलाना सबसे आसान तरीका होता, लेकिन अफसोस कि ऐसा नहीं किया जा सका
  • flag की गई और हटाई गई टिप्पणी का समर्थन नहीं करना चाहता। शायद वह टिप्पणी अपने लहज़े की वजह से हटाई गई, लेकिन वह अच्छी तरह दिखाती है कि इस प्रोडक्ट में QA नहीं गया
  • अगर project root में formatter, package manager, linter और CI के लिए 50 dotfiles नहीं हैं, तो आप असली software engineer नहीं हैं
    • सोच रहा हूँ formatter config file को कौन format करता है
  • यह देखकर हैरानी हुई कि RUN parser command में grouping या semicolon को support नहीं करता
    • मैं इसे आमतौर पर इस तरह लिखना पसंद करता हूँ
    • RUN set -e ;\ export DEBIAN_FRONTEND=noninteractive ;\ etc etc
    • इसलिए लगता है यह tool मेरे लिए सही नहीं है
  • कहा गया है कि RUN parser command में grouping या semicolon को support नहीं करता, लेकिन example में दिखता है कि && support है। सोच रहा हूँ फर्क क्यों है
    • मैं आमतौर पर इसे इस तरह लिखता हूँ
    • RUN foo && \ bar && \ :
    • यह syntax के हिसाब से मुझे इसके बराबर लगता है
    • RUN set -e && \ foo ; \ bar ; \ :
  • multi-stage Dockerfile में हर stage के body को indent करना चाहूँगा
    • FROM foo ... FROM bar ...
    • इससे एक नज़र में समझना आसान होता है कि क्या हो रहा है
  • सोच रहा हूँ कि यह multi-stage Dockerfile को कैसे handle करता है। मैं हमेशा FROM के बाद के steps को indent करता हूँ ताकि stage ज़्यादा स्पष्ट हो। मेरे हिसाब से ऐसा न करना वैसा ही है जैसे दूसरी भाषाओं में function body को indent न करना
  • सोच रहा हूँ क्या Docker files को layer करने का कोई तरीका है। Compose की बात नहीं कर रहा, बल्कि अलग-अलग Docker layers को अच्छी तरह combine करने के तरीके की बात कर रहा हूँ
  • उम्मीद है dockerfmt के लिए कोई config file होगी। समय के साथ इसमें और ज़्यादा options जुड़ते जाएँगे। आखिरकार यह Turing-complete हो जाएगा
    • फिर formatter के लिए भी formatter चाहिए होगा
    • जैसे Shrek ने Donkey से कहा था, software प्याज़ की तरह होता है
  • मैं yaml LSP इस्तेमाल करता हूँ। शायद schema.org के Containerfile format को lookup करने की कोशिश करूँगा। हाल ही में Github Actions yaml files पर काम करते हुए इसके बारे में पहली बार पता चला। काफ़ी उपयोगी है