2 điểm bởi GN⁺ 2025-04-11 | 1 bình luận | Chia sẻ qua WhatsApp
  • Là công cụ thay thế hiện đại cho dockfmt, tự động sắp xếp Dockerfile và chuẩn hóa code style
  • Bên trong sử dụng buildkit để phân tích cú pháp Dockerfile và mvdan/sh để định dạng script shell trong lệnh RUN
  • Giúp duy trì code style nhất quán và có thể hữu ích trong quá trình code review cũng như môi trường CI

Cách sử dụng

dockerfmt [Dockerfile] [flags]  
dockerfmt [command]  
  • Các lệnh chính:
    • completion: tạo script tự động hoàn thành cho shell
    • help: trợ giúp lệnh
    • version: hiển thị phiên bản
  • Các cờ chính:
    • -c, --check: chỉ kiểm tra xem đã được định dạng hay chưa
    • -i, --indent: thiết lập số khoảng trắng thụt lề (mặc định 4)
    • -n, --newline: thêm ký tự xuống dòng ở cuối tệp
    • -s, --space-redirects: thêm khoảng trắng sau toán tử chuyển hướng
    • -w, --write: ghi đè nội dung đã thay đổi vào tệp gốc

Thiết lập hook pre-commit

  • Có thể tích hợp dưới dạng hook pre-commit
  • Ví dụ tệp .pre-commit-config.yaml:
    repos:  
      - repo: https://github.com/reteps/dockerfmt  
        rev: main  
        hooks:  
          - id: dockerfmt  
            args:  
              - --indent=4  
    

Các hạn chế hiện tại

  • Trong lệnh RUN, dấu chấm phẩy (;) hoặc nhóm lệnh vẫn chưa được hỗ trợ
  • Chưa có tính năng tự động xuống dòng cho các lệnh JSON dài
  • Không hỗ trợ directive # escape=X

Giới thiệu tính năng

  • Sử dụng mvdan/sh khi định dạng lệnh RUN

  • Hỗ trợ heredoc cơ bản:

    RUN <<EOF  
    echo "hello"  
    echo "world"  
    EOF  
    
  • Hỗ trợ chú thích bên trong lệnh RUN:

    RUN echo "hello" \  
        # this is a comment  
        && echo "world"  
    
    RUN echo "hello" \  
        # this is a comment  
        # that spans multiple lines  
        && echo "world"  
    
  • Công cụ cố gắng gắn chú thích đúng vào vị trí đã được định dạng, nhưng điều này khó thực hiện vì chú thích bị loại bỏ ở bước parser

JS binding

  • JS binding được bao gồm trong thư mục js
  • Có thể xem cách sử dụng trong js/README.md

Ghi chú khác

  • Vì vẫn là phiên bản trước 1.0.0 nên chưa khuyến nghị sử dụng trong môi trường production

1 bình luận

 
GN⁺ 2025-04-11
Ý kiến trên Hacker News
  • Tôi đã bật cười khi xem mã nguồn mà không tìm thấy Dockerfile. Cách dễ nhất để chạy nó với một tệp sẵn có là bằng Docker container, nhưng tiếc là không làm được
  • Tôi không muốn ủng hộ bình luận đã bị gắn cờ rồi xóa, nhưng bình luận đó có lẽ bị xóa vì giọng điệu, dù vậy nó cho thấy rất rõ rằng sản phẩm này chưa được QA
  • Nếu trong thư mục gốc của dự án không có 50 tệp chấm dành cho formatter, package manager, linter và CI thì bạn chưa phải là kỹ sư phần mềm đích thực
    • Tôi tự hỏi ai sẽ format tệp cấu hình của formatter
  • Tôi khá bất ngờ khi thấy parser của RUN không hỗ trợ nhóm lệnh hoặc dấu chấm phẩy trong câu lệnh
    • Tôi thích viết theo kiểu như sau
    • RUN set -e ;\ export DEBIAN_FRONTEND=noninteractive ;\ etc etc
    • Vì vậy có vẻ công cụ này không hợp với tôi
  • Người ta nói parser của RUN không hỗ trợ nhóm lệnh hoặc dấu chấm phẩy trong câu lệnh, nhưng ví dụ lại cho thấy nó hỗ trợ &&. Tôi thắc mắc vì sao lại có sự khác biệt đó
    • Tôi thường viết như sau
    • RUN foo && \ bar && \ :
    • Cú pháp này trông có vẻ tương đương với
    • RUN set -e && \ foo ; \ bar ; \ :
  • Tôi muốn phần thân của từng stage trong Dockerfile multi-stage được thụt lề
    • FROM foo ... FROM bar ...
    • Như vậy có thể dễ dàng nhìn ra chuyện gì đang diễn ra chỉ trong một cái nhìn
  • Tôi tò mò nó xử lý Dockerfile multi-stage như thế nào. Tôi luôn thụt lề các bước sau FROM để các stage rõ ràng hơn. Tôi nghĩ việc không làm vậy cũng giống như không thụt lề phần thân hàm trong các ngôn ngữ khác
  • Tôi tự hỏi có cách nào để phân lớp các Docker file không. Tôi không nói về Compose, mà là cách kết hợp các layer của Docker khác với nhau cho gọn
  • Tôi mong dockerfmt có tệp cấu hình. Theo thời gian chắc chắn sẽ có ngày càng nhiều tùy chọn được thêm vào. Cuối cùng nó sẽ đạt đến mức Turing-complete
    • Và rồi chúng ta sẽ cần một formatter cho chính formatter đó
    • Shrek đã nói với Donkey rằng phần mềm cũng giống như củ hành
  • Tôi dùng YAML LSP. Có lẽ nó sẽ tra cứu định dạng Containerfile của schema.org. Tôi chỉ mới biết đến điều này gần đây khi làm việc với các tệp YAML của GitHub Actions. Khá hữu ích đấy