2 คะแนน โดย GN⁺ 2025-04-11 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เป็นเครื่องมือทางเลือกสมัยใหม่ที่มาแทน dockfmt เดิม โดยช่วยจัดระเบียบ Dockerfile และปรับสไตล์โค้ดให้อัตโนมัติ
  • ภายในใช้ buildkit สำหรับวิเคราะห์ไวยากรณ์ Dockerfile และใช้ mvdan/sh สำหรับจัดรูปแบบสคริปต์เชลล์ภายในคำสั่ง RUN
  • ช่วยรักษาสไตล์โค้ดให้สม่ำเสมอ และมีประโยชน์ในการรีวิวโค้ดและในสภาพแวดล้อม CI

วิธีใช้งาน

dockerfmt [Dockerfile] [flags]  
dockerfmt [command]  
  • คำสั่งหลัก:
    • completion: สร้างสคริปต์ shell auto-completion
    • help: ดูวิธีใช้คำสั่ง
    • version: แสดงเวอร์ชัน
  • แฟล็กหลัก:
    • -c, --check: ตรวจสอบอย่างเดียวว่ามีการจัดรูปแบบหรือไม่
    • -i, --indent: กำหนดจำนวนช่องว่างสำหรับการย่อหน้า (ค่าเริ่มต้น 4)
    • -n, --newline: เพิ่มอักขระขึ้นบรรทัดใหม่ที่ท้ายไฟล์
    • -s, --space-redirects: เพิ่มช่องว่างหลังตัวดำเนินการ redirect
    • -w, --write: เขียนทับไฟล์ต้นฉบับด้วยเนื้อหาที่เปลี่ยนแปลง

การตั้งค่า Pre-commit hook

  • สามารถรวมเข้ากับ pre-commit hook ได้
  • ตัวอย่างไฟล์ .pre-commit-config.yaml:
    repos:  
      - repo: https://github.com/reteps/dockerfmt  
        rev: main  
        hooks:  
          - id: dockerfmt  
            args:  
              - --indent=4  
    

ข้อจำกัดในปัจจุบัน

  • ในคำสั่ง RUN ยังไม่รองรับเครื่องหมายอัฒภาค (;) หรือการจัดกลุ่มคำสั่ง
  • ยังไม่มีฟังก์ชันตัดบรรทัดอัตโนมัติสำหรับคำสั่ง JSON ที่ยาว
  • ไม่รองรับ directive # escape=X

แนะนำฟีเจอร์

  • ใช้ mvdan/sh ในการจัดรูปแบบคำสั่ง RUN

  • รองรับ heredoc พื้นฐาน:

    RUN <<EOF  
    echo "hello"  
    echo "world"  
    EOF  
    
  • รองรับคอมเมนต์ภายในคำสั่ง RUN:

    RUN echo "hello" \  
        # this is a comment  
        && echo "world"  
    
    RUN echo "hello" \  
        # this is a comment  
        # that spans multiple lines  
        && echo "world"  
    
  • พยายามจัดการให้คอมเมนต์แนบอยู่ในตำแหน่งที่ถูกต้องหลังการจัดรูปแบบ แต่ทำได้ยากเนื่องจากคอมเมนต์ถูกลบออกไปในขั้นตอน parser

JS binding

  • JS binding รวมอยู่ในไดเรกทอรี js
  • วิธีใช้งานดูได้ที่ js/README.md

หมายเหตุอื่น ๆ

  • ยังเป็นเวอร์ชันก่อน 1.0.0 จึงยังไม่แนะนำให้ใช้ในโปรดักชัน

1 ความคิดเห็น

 
GN⁺ 2025-04-11
ความคิดเห็นบน Hacker News
  • พอไปดูซอร์สโค้ดแล้วหา Dockerfile ไม่เจอ ก็อดขำไม่ได้ วิธีที่ง่ายที่สุดคือรันกับ Docker container บนไฟล์ที่มีอยู่แล้ว แต่น่าเสียดายที่ทำไม่ได้
  • ไม่อยากสนับสนุนคอมเมนต์ที่โดนปักธงและถูกลบไปแล้ว คอมเมนต์นั้นน่าจะถูกลบเพราะน้ำเสียง แต่ก็แสดงให้เห็นชัดเจนว่าผลิตภัณฑ์นี้ไม่ได้ผ่าน QA
  • ถ้าในรูทของโปรเจ็กต์ไม่มีไฟล์จุด 50 ไฟล์สำหรับ formatter, package manager, linter และ CI คุณก็ยังไม่ใช่วิศวกรซอฟต์แวร์ตัวจริง
    • แล้วใครจะเป็นคนฟอร์แมตไฟล์ตั้งค่า formatter กันนะ
  • ตกใจที่เห็นว่า RUN parser ไม่รองรับการจัดกลุ่มหรือ semicolon ในคำสั่ง
    • ฉันชอบเขียนแบบนี้มากกว่า
    • RUN set -e ;\ export DEBIAN_FRONTEND=noninteractive ;\ etc etc
    • เพราะงั้นเครื่องมือนี้คงไม่เหมาะกับฉัน
  • เขาบอกว่า RUN parser ไม่รองรับการจัดกลุ่มหรือ semicolon ในคำสั่ง แต่ในตัวอย่างกลับแสดงว่ารองรับ && เลยสงสัยว่าทำไมถึงต่างกัน
    • ปกติฉันจะเขียนแบบนี้
    • RUN foo && \ bar && \ :
    • ซึ่งดูเหมือนจะเทียบเท่ากันทางไวยากรณ์กับ
    • RUN set -e && \ foo ; \ bar ; \ :
  • อยากให้ใน Dockerfile แบบ multi-stage มีการย่อหน้าเนื้อหาของแต่ละ stage
    • FROM foo ... FROM bar ...
    • จะได้ดูออกง่าย ๆ ในพริบตาเดียวว่าเกิดอะไรขึ้น
  • สงสัยว่ามันจัดการกับ Dockerfile แบบ multi-stage อย่างไร ฉันมักจะย่อหน้าขั้นตอนหลัง FROM เสมอเพื่อให้แต่ละ stage ชัดเจนขึ้น คิดว่าถ้าไม่ทำแบบนั้นก็เหมือนกับภาษาอื่นที่ไม่ย่อหน้าเนื้อหาในฟังก์ชัน
  • สงสัยว่ามีวิธีทำ Docker file แบบ layered ได้ไหม ไม่ได้หมายถึง Compose แต่หมายถึงการรวมเลเยอร์ของ Docker ตัวอื่น ๆ เข้าด้วยกันให้ดี
  • อยากให้มีไฟล์ตั้งค่าสำหรับ dockerfmt เพราะเวลาผ่านไปมันจะมีตัวเลือกเพิ่มขึ้นเรื่อย ๆ สุดท้ายก็คงไปถึงระดับ Turing-complete
    • แล้วเราก็จะต้องมี formatter สำหรับ formatter
    • อย่างที่ Shrek บอก Donkey ไว้ว่า ซอฟต์แวร์ก็เหมือนหัวหอม
  • ฉันใช้ yaml LSP อยู่ น่าจะลองไปดูฟอร์แมต Containerfile ของ schema.org เพิ่งมารู้จักตอนทำไฟล์ yaml ของ Github Actions ไม่นานนี้เอง ค่อนข้างมีประโยชน์