Files
DevRunbook-Public/Dockerfile
T
DevRunbook release export cfd2804e27
Managed validation / full (push) Successful in 3m18s
Publish DevRunbook source
2026-09-03 04:09:17 +02:00

97 lines
4.2 KiB
Docker

# syntax=docker/dockerfile:1.7
ARG NODE_IMAGE=node:24.18.0-bookworm-slim@sha256:6f7b03f7c2c8e2e784dcf9295400527b9b1270fd37b7e9a7285cf83b6951452d
ARG POSTGRES_IMAGE=postgres:17.9-bookworm@sha256:47f917f7409eacd22fc5dfb1dee634e1b55cf0c01d1a7eb701be2227a03e0641
FROM ${NODE_IMAGE} AS base
ENV PNPM_HOME=/pnpm \
PATH=/pnpm:$PATH \
NEXT_TELEMETRY_DISABLED=1
WORKDIR /app
RUN corepack enable && corepack prepare pnpm@10.33.0 --activate
FROM base AS development
COPY . .
RUN pnpm install --frozen-lockfile
FROM development AS build
ENV NODE_ENV=production
RUN pnpm build
FROM build AS worker-bundle
RUN mkdir -p /out/worker/dist \
&& cp -a /app/apps/worker/dist/. /out/worker/dist/
FROM base AS migrate
ENV NODE_ENV=production
COPY --from=build --chown=node:node /app /app
USER node
CMD ["./packages/db/node_modules/.bin/tsx", "packages/db/src/migrate.ts"]
FROM ${NODE_IMAGE} AS web
ENV NODE_ENV=production \
NEXT_TELEMETRY_DISABLED=1 \
HOSTNAME=0.0.0.0 \
PORT=3000 \
CONTENT_ROOT=/content \
ARTIFACT_ROOT=/artifacts
WORKDIR /app
RUN rm -rf /usr/local/lib/node_modules/npm /usr/local/lib/node_modules/corepack /opt/yarn-v1.22.22 \
&& rm -f /usr/local/bin/npm /usr/local/bin/npx /usr/local/bin/corepack /usr/local/bin/yarn /usr/local/bin/yarnpkg \
&& mkdir -p /content/playbooks /content/catalog /artifacts \
&& chown -R node:node /app /content /artifacts
COPY --from=build --chown=node:node /app/apps/web/.next/standalone ./
COPY --from=build --chown=node:node /app/apps/web/.next/static ./apps/web/.next/static
COPY --from=build --chown=node:node /app/content/playbooks /content/playbooks
COPY --from=build --chown=node:node /app/catalog/seed-catalog.yaml /content/catalog/seed-catalog.yaml
USER node
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
CMD ["node", "-e", "fetch('http://127.0.0.1:3000/health/live').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"]
CMD ["node", "apps/web/server.js"]
FROM ${NODE_IMAGE} AS worker
ENV NODE_ENV=production \
CONTENT_ROOT=/content \
ARTIFACT_ROOT=/artifacts
WORKDIR /app
RUN rm -rf /usr/local/lib/node_modules/npm /usr/local/lib/node_modules/corepack /opt/yarn-v1.22.22 \
&& rm -f /usr/local/bin/npm /usr/local/bin/npx /usr/local/bin/corepack /usr/local/bin/yarn /usr/local/bin/yarnpkg \
&& mkdir -p /content/playbooks /content/catalog /artifacts \
&& chown -R node:node /app /content /artifacts
COPY --from=worker-bundle --chown=node:node /out/worker ./
COPY --from=build --chown=node:node /app/content/playbooks /content/playbooks
COPY --from=build --chown=node:node /app/catalog/seed-catalog.yaml /content/catalog/seed-catalog.yaml
USER node
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD ["node", "-e", "try{process.kill(1,0)}catch{process.exit(1)}"]
CMD ["node", "dist/index.js"]
FROM ${POSTGRES_IMAGE} AS all-in-one
ENV NODE_ENV=production \
NEXT_TELEMETRY_DISABLED=1 \
HOSTNAME=0.0.0.0 \
PORT=3000 \
PGDATA=/config/postgres \
CONTENT_ROOT=/content \
ARTIFACT_ROOT=/config/artifacts
WORKDIR /app
COPY --from=base /usr/local/bin/node /usr/local/bin/node
COPY --from=build /app /app
COPY --from=build /app/apps/web/.next/static /app/apps/web/.next/standalone/apps/web/.next/static
COPY --from=build /app/content/playbooks /content/playbooks
COPY --from=build /app/catalog/seed-catalog.yaml /content/catalog/seed-catalog.yaml
COPY docker/all-in-one-entrypoint.sh /usr/local/bin/devrunbook-all-in-one
RUN groupadd --gid 1000 node \
&& useradd --uid 1000 --gid 1000 --create-home --shell /usr/sbin/nologin node \
&& mkdir -p /config/postgres /config/artifacts /config/operator-content /content/playbooks /content/catalog \
&& chown -R node:node /app /content \
&& chown -R postgres:postgres /config/postgres \
&& chown -R node:node /config/artifacts /config/operator-content \
&& chmod 0755 /usr/local/bin/devrunbook-all-in-one
EXPOSE 3000
VOLUME ["/config"]
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
CMD ["node", "-e", "fetch('http://127.0.0.1:3000/health/ready').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"]
ENTRYPOINT ["/usr/local/bin/devrunbook-all-in-one"]