From 96febd59044a2ecd92d460974b05381db3785e53 Mon Sep 17 00:00:00 2001 From: Felipe Coutinho Date: Fri, 3 Apr 2026 22:45:48 +0000 Subject: [PATCH] fix(docker): separar deps drizzle do node_modules standalone O pnpm install no Stage 3 sobrescrevia o node_modules copiado do .next/standalone, removendo o modulo next e quebrando o startup. Agora as deps do drizzle-kit sao instaladas em /app/migrate/ antes de copiar o standalone, mantendo os dois node_modules isolados. Co-Authored-By: Claude Sonnet 4.6 --- Dockerfile | 35 ++++++++++++++++++----------------- docker-entrypoint.sh | 15 +++++++++++---- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/Dockerfile b/Dockerfile index a201def..957f48e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -56,10 +56,27 @@ WORKDIR /app RUN addgroup --system --gid 1001 nodejs && \ adduser --system --uid 1001 nextjs +# Instalar deps do drizzle-kit em diretório separado ANTES de copiar o standalone +# Isso evita que o pnpm install sobrescreva o node_modules do Next.js standalone +COPY --from=builder /app/package.json /tmp/pkg.json +RUN mkdir -p /app/migrate && \ + node -e "\ + const p=JSON.parse(require('fs').readFileSync('/tmp/pkg.json','utf8'));\ + require('fs').writeFileSync('/app/migrate/package.json',JSON.stringify({\ + name:'openmonetis-migrate',version:p.version,\ + dependencies:{\ + 'drizzle-orm':p.dependencies['drizzle-orm'],\ + 'pg':p.dependencies['pg']\ + },\ + devDependencies:{'drizzle-kit':p.devDependencies['drizzle-kit']}\ + }));" && \ + cd /app/migrate && pnpm install --no-frozen-lockfile --ignore-scripts && \ + chown -R nextjs:nodejs /app/migrate + # Copiar apenas arquivos necessários para produção COPY --from=builder --chown=nextjs:nodejs /app/public ./public -# Copiar arquivos de build do Next.js +# Copiar arquivos de build do Next.js (inclui node_modules standalone com next) COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static @@ -68,22 +85,6 @@ COPY --from=builder --chown=nextjs:nodejs /app/drizzle ./drizzle COPY --from=builder --chown=nextjs:nodejs /app/drizzle.config.ts ./drizzle.config.ts COPY --from=builder --chown=nextjs:nodejs /app/src/db ./src/db -# Instalar apenas as deps necessárias para drizzle-kit migrate -# Gera package.json mínimo a partir do original para evitar version drift -COPY --from=builder /app/package.json /tmp/pkg.json -RUN node -e "\ - const p=JSON.parse(require('fs').readFileSync('/tmp/pkg.json','utf8'));\ - require('fs').writeFileSync('package.json',JSON.stringify({\ - name:'openmonetis',version:p.version,\ - dependencies:{\ - 'drizzle-orm':p.dependencies['drizzle-orm'],\ - 'pg':p.dependencies['pg']\ - },\ - devDependencies:{'drizzle-kit':p.devDependencies['drizzle-kit']}\ - }));" && \ - pnpm install --no-frozen-lockfile --ignore-scripts && \ - chown nextjs:nodejs package.json - # Copiar entrypoint de migrations COPY docker-entrypoint.sh ./ RUN chmod +x /app/docker-entrypoint.sh && chown nextjs:nodejs /app/docker-entrypoint.sh diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 2e66374..d0ee356 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,8 +1,15 @@ #!/bin/sh -set -e -echo "Rodando migrations do banco de dados..." -./node_modules/.bin/drizzle-kit push -echo "Migrations concluídas." +echo "Rodando migrations..." +RETRIES=5 +until /app/migrate/node_modules/.bin/drizzle-kit push || [ "$RETRIES" -eq 0 ]; do + RETRIES=$((RETRIES - 1)) + echo "Migration falhou, aguardando banco... ($RETRIES tentativas restantes)" + sleep 5 +done + +if [ "$RETRIES" -eq 0 ]; then + echo "Aviso: migrations nao foram aplicadas" +fi exec "$@"