# Base FROM node:20 AS base ARG APP_HOME=/home/node/app ARG SERVICE WORKDIR ${APP_HOME} RUN corepack enable # Build FROM base AS build ARG APP_HOME=/home/node/app WORKDIR ${APP_HOME} COPY package.json pnpm-lock.yaml pnpm-workspace.yaml tsconfig*.json .swcrc ./ COPY apps/${SERVICE}/package.json ./apps/${SERVICE}/ COPY apps/shared/package.json ./apps/shared/ RUN pnpm install --frozen-lockfile COPY apps/${SERVICE} ./apps/${SERVICE} COPY apps/shared ./apps/shared RUN pnpm --filter shared build RUN pnpm --filter ${SERVICE} build:production RUN pnpm --filter ${SERVICE} --prod deploy build RUN pnpm --filter shared --prod deploy shared # Final FROM node:20 AS final ARG APP_HOME=/home/node/app ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} WORKDIR ${APP_HOME} ENTRYPOINT ["./docker-entrypoint.sh"] CMD ["node", "dist/main.js"] COPY --chown=node:node ./docker-entrypoint.sh ./docker-entrypoint.sh COPY --from=build --chown=node:node ${APP_HOME}/build/dist ./dist COPY --from=build --chown=node:node ${APP_HOME}/shared/dist ./shared COPY --from=build --chown=node:node ${APP_HOME}/build/node_modules ./node_modules COPY --from=build --chown=node:node ${APP_HOME}/build/package.json . # Cut unnecessary stuff from package.json. Only leave name, version and module type RUN node -e "\ const { name, version, type } = JSON.parse(fs.readFileSync('./package.json', 'utf-8'));\ fs.writeFileSync('./package.json', JSON.stringify({ name, version, type }, null, 2));\ " USER node