Olá, Thiago! Sei algumas coisas sobre dockerfile, vou tentar repassar.
Os padrões existem sim, inclusive ajudam muito. Você pode pesquisar exemplos de dockerfile multi-stage genérico após essa leitura, provavelmente já irá entender algumas coisas.
Sobre a organização de dockerfiles:
essa é uma ordem lógica: FROM → ARG → ENV → WORKDIR → COPY/ADD → RUN → HEALTHCHECK → EXPOSE → USER → ENTRYPOINT/CMD.
Minimize camadas
Nas camadas, é possível combinar o RUN, mas se for virando um comando gigante, é meio que impossível manter.
Cache inteligente
O COPY de arquivos é extremamente útil, fazer o copy em arquivos que são mais estáveis (como o package.json) para aproveitar cache nas instalações.
Imagem
Na sua imagem, utilizar o ARG é muito bom para as credenciais em build. Nunca coloque suas senhas diretamente no ENV.
Reprodução
É importante fixar versões de base e dependências, evite utilizar o "latest".
Segurança
Utilize um USER que não seja root; utilize imagens slim/alpine para ter uma imagem leve (kb); limpe o cache no RUN.
Observabilidade
O HEALTHCHECK ajuda a detectar conteineres zumbis (de pé, porém "mortos").
Sobre sua dúvida de separar em múltiplos arquivos e estruturas
Multi-stage build é muito recomendado
Em um único Dockerfile, é possível criar estágios: “builder”, “test”, “runtime”. Copie só o necessário para o final. Isso faz a “separação” das responsabilidades sem multiplicar arquivos.
Scripts externos
Mantenha lógica complexa em scripts versionados (bash, shell, python, etc) e apenas o "RUN ./scripts/build.sh" no Dockerfile
Docker-Compose
Esse é muito útil, pois separa os serviços e os build no docker-compose.yml, mantendo os dockerfiles focados nos seus serviços.
Build args e targets
Parâmetros com ARG e "--target" permitem a você “quebrar” processos de build sem multiplicar arquivos.
Resumindo: você não “inclui” pedaços de Dockerfile como se fosse um import; você separa por estágios, por arquivos por serviço, e por scripts auxiliares.
Sobre sua dúvida nas IDE's
VS Code:
Tem a extensão Docker (lint básico, build, run, attach, compose). Dev Containers para desenvolver “dentro” do container. IntelliSense para Dockerfile mais tarefas de build.
JetBrains (IntelliJ/IDEA/GoLand/WebStorm):
Também possui suporte a Docker e Compose integrados, inspeções, run configurations.
Linting/Style:
hadolint (linter de Dockerfile) integrado via tasks ou plugins.
AI na IDE:
Pode usar o GitHub Copilot que sugere instruções, refatora, comenta. Também há extensões de chat das IA's que ajudam a revisar Dockerfiles e gerar trechos. Mas é sempre bom você não confiar cegamente, estude para revisar o trabalho da IA, pois às vezes vem aquela alucinada ou códigos que simplesmente não resolvem e ainda atrapalha rsrs