2 pontos por GN⁺ 2025-04-11 | 1 comentários | Compartilhar no WhatsApp
  • Uma alternativa modernizada ao dockfmt, ferramenta que organiza automaticamente Dockerfiles e padroniza o estilo do código
  • Internamente, usa buildkit para analisar a sintaxe de Dockerfile e mvdan/sh para formatar scripts de shell dentro de comandos RUN
  • Ajuda a manter um estilo de código consistente e pode ser útil em code reviews e ambientes de CI

Como usar

dockerfmt [Dockerfile] [flags]  
dockerfmt [command]  
  • Principais comandos:
    • completion: gera scripts de autocompletar para shell
    • help: ajuda dos comandos
    • version: exibe a versão
  • Principais flags:
    • -c, --check: verifica apenas se a formatação é necessária
    • -i, --indent: define o número de espaços de indentação (padrão: 4)
    • -n, --newline: adiciona um caractere de nova linha no final do arquivo
    • -s, --space-redirects: adiciona espaço após operadores de redirecionamento
    • -w, --write: sobrescreve o arquivo original com o conteúdo alterado

Configuração do hook de pre-commit

  • Pode ser integrado como hook de pre-commit
  • Exemplo de arquivo .pre-commit-config.yaml:
    repos:  
      - repo: https://github.com/reteps/dockerfmt  
        rev: main  
        hooks:  
          - id: dockerfmt  
            args:  
              - --indent=4  
    

Limitações atuais

  • Ainda não há suporte para ponto e vírgula (;) ou agrupamento de comandos em instruções RUN
  • Não há recurso de quebra automática de linha para comandos JSON longos
  • A diretiva # escape=X não é suportada

Recursos

  • Usa mvdan/sh na formatação de comandos RUN

  • Suporte básico a heredoc:

    RUN <<EOF  
    echo "hello"  
    echo "world"  
    EOF  
    
  • Suporte a comentários dentro de comandos RUN:

    RUN echo "hello" \  
        # this is a comment  
        && echo "world"  
    
    RUN echo "hello" \  
        # this is a comment  
        # that spans multiple lines  
        && echo "world"  
    
  • Tenta manter os comentários corretamente anexados à posição formatada, mas isso é difícil porque os comentários são removidos na etapa do parser

Binding JS

  • O binding JS está incluído no diretório js
  • O modo de uso pode ser consultado em js/README.md

Outras observações

  • Como ainda está em uma versão anterior à 1.0.0, o uso em produção não é recomendado

1 comentários

 
GN⁺ 2025-04-11
Comentários no Hacker News
  • Dei uma risada ao olhar o código-fonte e não encontrar um Dockerfile. A forma mais fácil de executar isso em relação a um arquivo existente seria com um contêiner Docker, mas infelizmente não dava
  • Não quero apoiar o comentário sinalizado e removido. Ele provavelmente foi removido por causa do tom, mas mostra bem que não houve QA nesse produto
  • Se não houver 50 dotfiles no root do projeto para formatter, gerenciador de pacotes, linter e CI, então você não é um verdadeiro engenheiro de software
    • Fico me perguntando quem formata o arquivo de configuração do formatter
  • Fiquei surpreso ao ver que o parser de RUN não suporta agrupamento nem ponto e vírgula nos comandos
    • Eu prefiro escrever assim
    • RUN set -e ;\ export DEBIAN_FRONTEND=noninteractive ;\ etc etc
    • Então acho que essa ferramenta não serve para mim
  • Dizem que o parser de RUN não suporta agrupamento nem ponto e vírgula nos comandos, mas o exemplo mostra suporte a &&. Fico curioso sobre a diferença
    • Normalmente eu escrevo assim
    • RUN foo && \ bar && \ :
    • Isso parece sintaticamente equivalente a
    • RUN set -e && \ foo ; \ bar ; \ :
  • Em Dockerfiles multi-stage, eu gostaria de indentar o corpo de cada stage
    • FROM foo ... FROM bar ...
    • Assim fica fácil ver de relance o que está acontecendo
  • Fico curioso sobre como ele lida com Dockerfiles multi-stage. Eu sempre indento as etapas depois de FROM para deixar cada stage mais claro. Acho que não fazer isso é como não indentar o corpo de uma função em outras linguagens
  • Fico curioso se existe uma forma de compor Dockerfiles em camadas. Não estou falando de Compose, mas de uma boa forma de combinar camadas de outros Dockerfiles
  • Gostaria que houvesse um arquivo de configuração para o dockerfmt. Com o tempo, vão acabar adicionando cada vez mais opções. No fim, ele vai chegar à completude de Turing
    • Aí vai ser preciso um formatter para o formatter
    • Como o Shrek disse ao Burro, software é como uma cebola
  • Eu uso o yaml LSP. Provavelmente vou tentar consultar o formato Containerfile do schema.org. Descobri isso recentemente enquanto trabalhava em arquivos yaml do GitHub Actions. É bem útil