2 ポイント 投稿者 GN⁺ 2025-04-11 | 1件のコメント | WhatsAppで共有
  • 既存のdockfmtを現代化した代替ツールで、Dockerfileを自動的に整理し、コードスタイルを整えるツール
  • 内部的にはDockerfileの構文解析にbuildkitを、RUN命令内のシェルスクリプト整形にmvdan/shを使用
  • 一貫したコードスタイルを維持でき、コードレビューやCI環境で有用に使える

使い方

dockerfmt [Dockerfile] [flags]  
dockerfmt [command]  
  • 主なコマンド:
    • completion: シェル自動補完スクリプトを生成
    • help: コマンドヘルプ
    • version: バージョンを表示
  • 主なフラグ:
    • -c, --check: フォーマットされているかどうかのみ確認
    • -i, --indent: インデントの空白数を設定(デフォルトは4)
    • -n, --newline: ファイル末尾に改行文字を追加
    • -s, --space-redirects: リダイレクト演算子の後ろに空白を追加
    • -w, --write: 変更内容を元のファイルに上書き

Pre-commitフック設定

  • pre-commitフックとして統合可能
  • .pre-commit-config.yamlファイルの例:
    repos:  
      - repo: https://github.com/reteps/dockerfmt  
        rev: main  
        hooks:  
          - id: dockerfmt  
            args:  
              - --indent=4  
    

現在の制限事項

  • RUN命令でのセミコロン(;)やコマンドのグループ化はまだサポートされていない
  • 長いJSONコマンドの自動改行機能はない
  • # escape=Xディレクティブはサポートされていない

機能紹介

  • RUN命令のフォーマット時にmvdan/shを活用

  • 基本的な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"  
    
  • コメントがフォーマット後の位置に正しく紐づくようにしようとしているが、パーサ段階でコメントが削除されるため難しさがある

JSバインディング

  • JSバインディングはjsディレクトリに含まれている
  • 使い方はjs/README.mdで確認可能

その他の参考事項

  • まだ1.0.0未満のバージョンのため、本番環境での利用は推奨されない

1件のコメント

 
GN⁺ 2025-04-11
Hacker Newsの意見
  • ソースコードを見てもDockerfileが見当たらず、思わず笑ってしまった。既存ファイルに対してDockerコンテナとして実行するのがいちばん簡単な方法なのに、残念ながらそれはできなかった
  • フラグが付いて削除されたコメントを擁護したいわけではない。そのコメントはたぶん口調のせいで削除されたのだと思うが、この製品にQAが入っていなかったことをよく示している
  • プロジェクトのルートにフォーマッタ、パッケージマネージャー、リンター、CIのための50個のドットファイルがなければ、本当のソフトウェアエンジニアではない
    • フォーマッタの設定ファイルは誰がフォーマットするのか気になる
  • RUN パーサーがコマンド内のグループ化やセミコロンをサポートしていないと知って驚いた
    • 私は次のような書き方を好む
    • RUN set -e ;\ export DEBIAN_FRONTEND=noninteractive ;\ etc etc
    • だからこのツールは自分には合わなそうだ
  • RUN パーサーがコマンド内のグループ化やセミコロンをサポートしていないと言いつつ、例では && をサポートしていることを示している。なぜ違いがあるのか気になる
    • 私はたいてい次のように書く
    • RUN foo && \ bar && \ :
    • これは文法的には次と同じに見える
    • RUN set -e && \ foo ; \ bar ; \ :
  • マルチステージDockerfileでは、各ステージの本文をインデントしたい
    • FROM foo ... FROM bar ...
    • 何が起きているのかをひと目で把握しやすくなる
  • マルチステージDockerfileをどう扱うのか気になる。私はいつも FROM の次のステップをインデントして、ステージをより明確にしている。そうしないのは、他の言語で関数本体をインデントしないのと同じだと思う
  • Dockerファイルをレイヤー化する方法があるのか気になる。Composeのことではなく、別のDockerのレイヤーをうまく組み合わせる方法のことだ
  • dockerfmt用の設定ファイルがあってほしい。時間が経つにつれて、どんどんオプションが増えていくだろう。最終的にはチューリング完全性に達するはずだ
    • そうなるとフォーマッタのためのフォーマッタが必要になる
    • ソフトウェアはタマネギのようなものだとShrekがDonkeyに言っていた
  • 私はyaml LSPを使っている。おそらくschema.orgのContainerfile形式を参照しようとするだろう。最近GitHub Actionsのyamlファイルを作業していて初めて知った。かなり便利だ