# Stage 0: install and prepare TinyTex FROM debian:bookworm-slim AS tex-builder RUN apt-get update && apt-get install -y \ wget perl \ && rm -rf /var/lib/apt/lists/* RUN wget -qO- https://yihui.org/tinytex/TinyTeX-0.tar.gz | tar -xz -C /tmp/ RUN /tmp/.TinyTeX/bin/x86_64-linux/tlmgr install \ latex-bin \ pdftex \ geometry \ pgf \ etoolbox \ csvsimple \ csquotes \ tools \ ec \ cm-super # App starts here FROM oven/bun:slim AS base WORKDIR /usr/src/app ENV NODE_ENV=production ENV APP_USER_DATA_PATH="/app-data/user-data" ENV APP_TMP_USER_DATA_PATH="/app-data/tmp" ## Stage 1: Install dependencies FROM base AS install # install development dependencies RUN mkdir -p /temp/dev COPY package.json bun.lockb /temp/dev/ RUN cd /temp/dev && bun install --frozen-lockfile # install production dependencies RUN mkdir -p /temp/prod COPY package.json bun.lockb /temp/prod/ RUN cd /temp/prod && bun install --frozen-lockfile --production ## Stage 2: Build app FROM base AS prerelease # copy dependencies into workdir COPY --from=install /temp/dev/node_modules node_modules # add project files COPY . . # build project RUN bun run build ## Stage 3: Put everything together FROM base AS release # compose the final image COPY --from=tex-builder /tmp/.TinyTeX .TinyTeX COPY --from=install /temp/prod/node_modules node_modules COPY --from=prerelease /usr/src/app/build . COPY --from=prerelease /usr/src/app/templates ./templates ENV PATH="/usr/src/app/.TinyTeX/bin/x86_64-linux:${PATH}" RUN mkdir /app-data && chown bun:bun /app-data RUN chown -R bun:bun .TinyTeX VOLUME ["/app-data"] USER bun EXPOSE 3000/tcp ENTRYPOINT [ "bun", "--bun", "./index.js" ]