dockerfmt - Dockerfile 포매터
(github.com/reteps)- 기존
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 이전 버전이므로 프로덕션 환경 사용은 권장되지 않음
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 파일 작업 중에 처음 알게 되었음. 꽤 유용함