2P by GN⁺ 9일전 | ★ favorite | 댓글 1개
  • 기존 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 파일 작업 중에 처음 알게 되었음. 꽤 유용함