FROM node:24.22-alpine3.23 AS build # Move files into the image and install WORKDIR /app RUN corepack enable COPY ./bskylink/package.json ./ COPY ./bskylink/pnpm-lock.yaml ./bskylink/pnpm-workspace.yaml ./ RUN pnpm install --frozen-lockfile COPY ./bskylink/tsconfig.json ./ COPY ./bskylink/src ./src COPY ./bskylink/locales ./locales # build then prune dev deps RUN pnpm build RUN pnpm install --prod --frozen-lockfile --ignore-scripts --prefer-offline # Uses assets from build stage to reduce build size FROM node:24.22-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 9090 ENV LINK_PORT=3000 ENV LINK_METRICS_PORT=9090 ENV NODE_ENV=production ENV NODE_OPTIONS="--import=@atproto-labs/fetch-node/emudhra-preload" # 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 Link Service" LABEL org.opencontainers.image.licenses=UNLICENSED