Skip to content

Gera .gitignore/.dockerignore e roda produção sem root no Dockerfile - #34

Merged
Hirley merged 1 commit into
mainfrom
claude-hirley/gitignore-dockerignore-hardening
Aug 30, 2026
Merged

Hirley merged 1 commit into
mainfrom
claude-hirley/gitignore-dockerignore-hardening

Conversation

@Hirley

@Hirley Hirley commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Resumo

  • A gem nunca gerava .gitignore nem .dockerignore, apesar do .clignore já listar .env, *.pem, *.key e config/master.key como sensíveis: um git add . logo após o init podia commitar esses arquivos, e o Dockerfile gerado fazia COPY . . sem filtro nenhum — segredos e até o histórico do .git iam parar nas camadas da imagem.
  • Adiciona GitignoreGenerator.gitignore (sempre gerado, junto de .clignore) e DockerignoreGenerator.dockerignore (parte do grupo --no-docker), cobrindo os mesmos padrões sensíveis. .dockerignore deliberadamente não exclui /spec/, já que o estágio development do Dockerfile roda rspec dentro do container.
  • Corrige o estágio production do Dockerfile.erb, que rodava como root (nenhum estágio tinha USER): adiciona usuário app não-root só nesse estágio via groupadd/useradd + COPY --chown. Os estágios builder/development continuam root de propósito, para não quebrar o bind mount .:/app do docker-compose.yml em desenvolvimento (usuário não-root ali causa conflito de permissão com o UID do host).

Test plan

  • Specs Red→Green: spec/generators/gitignore_generator_spec.rb, spec/generators/dockerignore_generator_spec.rb, novo teste em spec/generators/dockerfile_generator_spec.rb (confere USER app especificamente dentro do estágio production), 2 novos testes em spec/cli_spec.rb (.gitignore sai mesmo com --no-docker; .dockerignore some com --no-docker).
  • bundle exec rspec — 64 examples, 0 failures, 100% line coverage (170/170).
  • bundle exec rubocop — 0 offenses (exceto Layout/EndOfLine pré-existente no Windows, não é regressão).
  • Smoke test real (fora do FakeFS): rodei agentic_dev_workflow init num diretório novo e conferi .gitignore, .dockerignore e Dockerfile gerados byte a byte.
  • Não testado: docker build de verdade da imagem production (Docker não disponível neste ambiente) — vale confirmar que a imagem builda e roda com o usuário app antes do merge.

🤖 Generated with Claude Code

A gem nunca gerava .gitignore nem .dockerignore, apesar do .clignore já
listar .env, *.pem, *.key e config/master.key como sensíveis: um `git add .`
logo após o init podia commitar esses arquivos, e o Dockerfile gerado fazia
COPY . . sem filtro, colocando segredos e até o histórico do .git nas
camadas da imagem. Adiciona GitignoreGenerator (sempre gerado) e
DockerignoreGenerator (parte do grupo --no-docker) cobrindo os mesmos
padrões.

Também corrige o estágio production do Dockerfile.erb, que rodava como
root (nenhum estágio tinha USER): adiciona usuário app não-root só nesse
estágio via groupadd/useradd + COPY --chown. builder/development
continuam root de propósito, para não quebrar o bind mount `.:/app` do
docker-compose.yml em desenvolvimento.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Hirley
Hirley merged commit c4d9dbb into main Aug 30, 2026
3 checks passed
@Hirley
Hirley deleted the claude-hirley/gitignore-dockerignore-hardening branch August 30, 2026 15:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant