# dockerfmt - Dockerfile 포매터

> Clean Markdown view of GeekNews topic #20260. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=20260](https://news.hada.io/topic?id=20260)
- GeekNews Markdown: [https://news.hada.io/topic/20260.md](https://news.hada.io/topic/20260.md)
- Type: GN+
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2025-04-11T09:46:47+09:00
- Updated: 2025-04-11T09:46:47+09:00
- Original source: [github.com/reteps](https://github.com/reteps/dockerfmt)
- Points: 2
- Comments: 1

## Topic Body

- 기존 `dockfmt`의 현대화된 대체 도구로, Dockerfile을 자동으로 정리하고 코드 스타일을 맞춰주는 도구임  
- 내부적으로 Dockerfile 구문 분석을 위해 `buildkit`을, `RUN` 명령 내 쉘 스크립트 포매팅을 위해 `mvdan/sh`를 사용함  
- 일관된 코드 스타일을 유지하고 코드 리뷰 및 CI 환경에서 유용하게 사용될 수 있음  
  
### 사용법  
```bash  
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 파일 예시:  
  ```yaml  
  repos:  
    - repo: https://github.com/reteps/dockerfmt  
      rev: main  
      hooks:  
        - id: dockerfmt  
          args:  
            - --indent=4  
  ```  
### 현재 제한사항  
- RUN 명령어에서 세미콜론(;)이나 명령 그룹화는 아직 지원되지 않음  
- 긴 JSON 명령어에 대한 자동 줄 바꿈 기능 없음  
- `# escape=X` 디렉티브는 지원되지 않음  
  
### 기능 소개  
- RUN 명령 포매팅 시 mvdan/sh를 활용함  
- 기본 heredoc 지원:  
  ```docker   
  RUN <<EOF  
  echo "hello"  
  echo "world"  
  EOF  
  ```  
- RUN 명령 내 주석 처리 지원:  
  ```dockerfile  
  RUN echo "hello" \  
      # this is a comment  
      && echo "world"  
  ```  
  
  ```dockerfile  
  RUN echo "hello" \  
      # this is a comment  
      # that spans multiple lines  
      && echo "world"  
  ```  
- 주석이 포매팅된 위치에 올바르게 붙도록 처리하려고 하지만, 이는 파서 단계에서 주석이 제거되므로 어려움이 있음  
  
### JS 바인딩  
- JS 바인딩은 js 디렉터리에 포함되어 있음  
- 사용법은 js/README.md에서 확인 가능함  
  
### 기타 참고사항  
- 아직 1.0.0 이전 버전이므로 프로덕션 환경 사용은 권장되지 않음

## Comments



### Comment 37019

- Author: neo
- Created: 2025-04-11T09:46:47+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=43628037) 
- 소스 코드를 보고 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 파일 작업 중에 처음 알게 되었음. 꽤 유용함
