-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
6d16962
commit 22009eb
Showing
1 changed file
with
46 additions
and
51 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,84 +1,79 @@ | ||
# Estágio de build | ||
FROM node:20-alpine AS builder | ||
|
||
# Definir argumentos e variáveis de ambiente no início | ||
# Definir o build argument | ||
ARG DATABASE_URL | ||
|
||
# Passar o build argument para variável de ambiente | ||
ENV DATABASE_URL=${DATABASE_URL} | ||
ENV PNPM_HOME="/pnpm" | ||
ENV PATH="$PNPM_HOME:$PATH" | ||
ENV NODE_ENV="production" | ||
|
||
# Configurar diretório de trabalho | ||
# Instalar OpenSSL e outras dependências necessárias | ||
RUN apk add --no-cache openssl openssl-dev | ||
|
||
WORKDIR /app | ||
|
||
# Instalar dependências do sistema em uma única camada | ||
RUN apk add --no-cache openssl openssl-dev && \ | ||
corepack enable && \ | ||
corepack prepare pnpm@latest --activate | ||
# Instalar pnpm | ||
RUN corepack enable && corepack prepare pnpm@latest --activate | ||
|
||
# Copiar arquivos do workspace | ||
COPY pnpm-workspace.yaml ./ | ||
COPY package.json ./ | ||
COPY pnpm-lock.yaml ./ | ||
|
||
# Copiar apenas arquivos necessários para instalação de dependências | ||
COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./ | ||
# Copiar pacotes compartilhados | ||
COPY packages/ ./packages/ | ||
COPY config/ ./config/ | ||
COPY apps/api/package.json ./apps/api/ | ||
|
||
# Instalar dependências em uma única camada | ||
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ | ||
pnpm install --frozen-lockfile | ||
|
||
# Copiar código fonte após instalação de dependências | ||
# Copiar código da API | ||
COPY apps/api/ ./apps/api/ | ||
|
||
# Gerar Prisma Client e fazer build | ||
# Instalar dependências | ||
RUN pnpm install --frozen-lockfile | ||
|
||
# Atualizar @prisma/client e instalar prisma CLI | ||
RUN cd apps/api && \ | ||
pnpm add @prisma/[email protected] && \ | ||
pnpm prisma generate && \ | ||
pnpm add -D [email protected] | ||
|
||
# Gerar Prisma Client e fazer build | ||
RUN cd apps/api && \ | ||
pnpm exec prisma generate && \ | ||
pnpm build | ||
|
||
# Estágio de produção | ||
# Imagem de produção | ||
FROM node:20-alpine | ||
|
||
# Definir variáveis de ambiente | ||
ENV NODE_ENV="production" | ||
ENV PNPM_HOME="/pnpm" | ||
ENV PATH="$PNPM_HOME:$PATH" | ||
RUN addgroup -S appgroup && adduser -S appuser -G appgroup | ||
|
||
# Criar usuário não-root | ||
RUN addgroup -S appgroup && \ | ||
adduser -S appuser -G appgroup && \ | ||
apk add --no-cache openssl && \ | ||
corepack enable && \ | ||
corepack prepare pnpm@latest --activate | ||
# Instalar OpenSSL na imagem de produção também | ||
RUN apk add --no-cache openssl | ||
|
||
# Configurar diretório de trabalho | ||
WORKDIR /app | ||
|
||
RUN corepack enable && corepack prepare pnpm@latest --activate | ||
|
||
# Copiar arquivos necessários do builder | ||
COPY --chown=appuser:appgroup --from=builder /app/package.json ./ | ||
COPY --chown=appuser:appgroup --from=builder /app/pnpm-workspace.yaml ./ | ||
COPY --chown=appuser:appgroup --from=builder /app/pnpm-lock.yaml ./ | ||
COPY --chown=appuser:appgroup --from=builder /app/apps/api/package.json ./apps/api/ | ||
COPY --chown=appuser:appgroup --from=builder /app/apps/api/dist ./apps/api/dist | ||
COPY --chown=appuser:appgroup --from=builder /app/packages ./packages | ||
COPY --chown=appuser:appgroup --from=builder /app/config ./config | ||
COPY --chown=appuser:appgroup --from=builder /app/node_modules ./node_modules | ||
COPY --chown=appuser:appgroup --from=builder /app/apps/api/node_modules ./apps/api/node_modules | ||
COPY --chown=appuser:appgroup --from=builder /app/apps/api/prisma ./apps/api/prisma | ||
|
||
# Instalar apenas dependências de produção | ||
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ | ||
pnpm install --prod --frozen-lockfile | ||
|
||
# Mudar para usuário não-root | ||
COPY --from=builder /app/package.json ./ | ||
COPY --from=builder /app/pnpm-workspace.yaml ./ | ||
COPY --from=builder /app/pnpm-lock.yaml ./ | ||
COPY --from=builder /app/apps/api/package.json ./apps/api/ | ||
COPY --from=builder /app/apps/api/dist ./apps/api/dist | ||
COPY --from=builder /app/packages ./packages | ||
COPY --from=builder /app/config ./config | ||
|
||
# Copiar node_modules e garantir que o Prisma seja instalado corretamente | ||
COPY --from=builder /app/node_modules ./node_modules | ||
COPY --from=builder /app/apps/api/node_modules ./apps/api/node_modules | ||
COPY --from=builder /app/apps/api/prisma ./apps/api/prisma | ||
|
||
# Instalar apenas as dependências de produção | ||
RUN pnpm install --prod --frozen-lockfile | ||
|
||
USER appuser | ||
|
||
# Configurar diretório de trabalho final | ||
WORKDIR /app/apps/api | ||
|
||
# Expor porta | ||
EXPOSE 3333 | ||
|
||
# Definir healthcheck | ||
HEALTHCHECK --interval=30s --timeout=3s \ | ||
CMD wget --no-verbose --tries=1 --spider http://localhost:3333/health || exit 1 | ||
|
||
|