micro/Dockerfile

57 lines
1.2 KiB
Docker

FROM node:20-alpine AS deps
RUN apk add --no-cache libc6-compat make clang build-base python3
RUN npm i -g pnpm
WORKDIR /usr/src/micro
COPY pnpm-lock.yaml pnpm-workspace.yaml ./
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \
pnpm fetch
FROM node:20-alpine AS builder
WORKDIR /usr/src/micro
RUN apk add --no-cache git
RUN npm i -g pnpm
COPY --from=deps /usr/src/micro .
COPY . .
# install all deps
RUN pnpm install --offline --frozen-lockfile
# build everthing
RUN pnpm build
# use "pnpm deploy" to prune the api into a smaller package
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \
cd packages/api && pnpm --filter @ryanke/micro-api --prod deploy pruned
FROM node:20-alpine AS runner
ENV NODE_ENV production
WORKDIR /usr/src/micro
RUN apk add --no-cache ffmpeg
# copy file dependencies
COPY --from=builder --chown=node:node /usr/src/micro/packages/web/dist/ ./packages/web/dist/
COPY --from=builder --chown=node:node /usr/src/micro/packages/web/package.json ./packages/web/
# copy api
COPY --from=builder --chown=node:node /usr/src/micro/packages/api/pruned ./packages/api
COPY wrapper.sh .
RUN chmod +x ./wrapper.sh
USER node
ENTRYPOINT ["./wrapper.sh"]