FROM node:24.19.0-alpine3.23 AS build # Tells pnpm to run non-interactively (needed for install/script steps) ENV CI=true # Move files into the image and install WORKDIR /app COPY ./bskyogcard/package.json ./ COPY ./bskyogcard/pnpm-lock.yaml ./ COPY ./bskyogcard/pnpm-workspace.yaml ./ RUN npm install --global pnpm@11.21.0 RUN pnpm install --frozen-lockfile COPY ./bskyogcard ./ # build then prune dev deps RUN pnpm install-fonts && pnpm build RUN pnpm install --prod --ignore-scripts --prefer-offline # Uses assets from build stage to reduce build size FROM node:24.19.0-alpine3.23 RUN apk add --update dumb-init # Avoid zombie processes, handle signal forwarding ENTRYPOINT ["dumb-init", "--"] WORKDIR /app COPY --from=build /app /app RUN mkdir /app/data && chown node /app/data VOLUME /app/data EXPOSE 3000 3001 ENV CARD_PORT=3000 ENV CARD_METRICS_PORT=3001 ENV NODE_ENV=production # https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#non-root-user USER node CMD ["node", "--heapsnapshot-signal=SIGUSR2", "--enable-source-maps", "dist/bin.js"] LABEL org.opencontainers.image.source=https://github.com/bluesky-social/social-app LABEL org.opencontainers.image.description="Bsky Card Service" LABEL org.opencontainers.image.licenses=UNLICENSED