83 lines
3.1 KiB
Docker
83 lines
3.1 KiB
Docker
# Hocuspocus realtime-collaboration server image.
|
|
#
|
|
# Built from the monorepo root (build context = repository root) so the
|
|
# Docker layer cache can reuse pnpm install layers shared with the api /
|
|
# worker / web images. Final image is `node:20-bookworm-slim` running
|
|
# `apps/hocuspocus/dist/index.js` on port 1234.
|
|
FROM --platform=linux/amd64 node:20-bookworm-slim AS base
|
|
|
|
ENV NODE_ENV="production"
|
|
ENV CI="true"
|
|
ENV PNPM_HOME="/pnpm"
|
|
ENV PATH="$PNPM_HOME:$PATH"
|
|
|
|
RUN apt-get update \
|
|
&& apt-get install -y --no-install-recommends openssl curl \
|
|
&& rm -rf /var/lib/apt/lists/* \
|
|
&& corepack enable \
|
|
&& corepack prepare pnpm@10.33.0 --activate
|
|
|
|
FROM base AS deps
|
|
WORKDIR /myapp
|
|
ADD package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
ADD prisma prisma
|
|
ADD apps apps
|
|
ADD packages packages
|
|
RUN pnpm install --frozen-lockfile --prod=false
|
|
|
|
FROM base AS production-deps
|
|
WORKDIR /myapp
|
|
COPY --from=deps /myapp/node_modules /myapp/node_modules
|
|
ADD package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
ADD apps apps
|
|
ADD packages packages
|
|
RUN pnpm prune --prod
|
|
|
|
FROM base AS build
|
|
WORKDIR /myapp
|
|
COPY --from=deps /myapp/node_modules /myapp/node_modules
|
|
COPY --from=deps /myapp/apps /myapp/apps
|
|
COPY --from=deps /myapp/packages /myapp/packages
|
|
ADD package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
ADD prisma prisma
|
|
ADD prisma.config.ts prisma.config.ts
|
|
ADD tsconfig.json tsconfig.json
|
|
ADD packages/db packages/db
|
|
RUN pnpm exec prisma generate
|
|
RUN pnpm --filter @toolctrl/db build
|
|
ADD . .
|
|
RUN pnpm --filter @toolctrl/hocuspocus build
|
|
|
|
FROM base AS hocuspocus
|
|
ARG APP_REVISION=unknown
|
|
ENV NODE_ENV="production"
|
|
ENV HOCUSPOCUS_PORT="1234"
|
|
ENV HOCUSPOCUS_HOST="0.0.0.0"
|
|
ENV APP_REVISION="${APP_REVISION}"
|
|
LABEL org.opencontainers.image.revision="${APP_REVISION}"
|
|
EXPOSE 1234
|
|
|
|
WORKDIR /myapp
|
|
COPY --from=production-deps /myapp/node_modules /myapp/node_modules
|
|
COPY --from=build /myapp/package.json /myapp/package.json
|
|
COPY --from=build /myapp/pnpm-lock.yaml /myapp/pnpm-lock.yaml
|
|
COPY --from=build /myapp/pnpm-workspace.yaml /myapp/pnpm-workspace.yaml
|
|
COPY --from=build /myapp/tsconfig.json /myapp/tsconfig.json
|
|
COPY --from=build /myapp/apps/hocuspocus/package.json /myapp/apps/hocuspocus/package.json
|
|
COPY --from=deps /myapp/apps/hocuspocus/node_modules /myapp/apps/hocuspocus/node_modules
|
|
COPY --from=build /myapp/apps/hocuspocus/dist /myapp/apps/hocuspocus/dist
|
|
COPY --from=build /myapp/packages/db /myapp/packages/db
|
|
COPY --from=deps /myapp/packages/db/node_modules /myapp/packages/db/node_modules
|
|
COPY --from=build /myapp/packages/db/generated/prisma/client /myapp/packages/db/generated/prisma/client
|
|
COPY --from=build /myapp/packages/logger /myapp/packages/logger
|
|
COPY --from=deps /myapp/packages/logger/node_modules /myapp/packages/logger/node_modules
|
|
COPY --from=build /myapp/prisma /myapp/prisma
|
|
COPY --from=build /myapp/prisma.config.ts /myapp/prisma.config.ts
|
|
|
|
USER node
|
|
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
|
|
CMD node -e "require('net').connect(${HOCUSPOCUS_PORT:-1234}, '127.0.0.1').on('connect', () => process.exit(0)).on('error', () => process.exit(1))"
|
|
|
|
CMD ["node", "apps/hocuspocus/dist/index.js"]
|