| 1 | # syntax=docker/dockerfile:1 |
| 2 | # Built from the repository root: the API depends on the @ghost/db workspace. |
| 3 | # docker build -f apps/api/Dockerfile . |
| 4 | |
| 5 | # Keep in step with apps/zoekt/Dockerfile: the indexer and the webserver share a shard format. |
| 6 | FROM ghcr.io/sourcegraph/zoekt:0.0.0-20260911061844-153817f643cd AS zoekt |
| 7 | |
| 8 | FROM oven/bun:1.3.14 AS deps |
| 9 | WORKDIR /app |
| 10 | COPY package.json bun.lock ./ |
| 11 | COPY apps/api/package.json apps/api/package.json |
| 12 | COPY apps/web/package.json apps/web/package.json |
| 13 | COPY apps/docs/package.json apps/docs/package.json |
| 14 | COPY packages/db/package.json packages/db/package.json |
| 15 | COPY packages/languages/package.json packages/languages/package.json |
| 16 | RUN bun install --frozen-lockfile |
| 17 | |
| 18 | FROM deps AS build |
| 19 | WORKDIR /app |
| 20 | COPY . . |
| 21 | RUN bun run --filter @ghost/db build \ |
| 22 | && bun run --filter @ghost/languages build \ |
| 23 | && bun run --filter @ghost/api build |
| 24 | |
| 25 | # A second, clean install: the runtime needs neither the web app's dependencies |
| 26 | # nor the compilers, and pruning in place leaves Bun's package store behind. |
| 27 | FROM oven/bun:1.3.14 AS prod-deps |
| 28 | WORKDIR /app |
| 29 | COPY package.json bun.lock ./ |
| 30 | COPY apps/api/package.json apps/api/package.json |
| 31 | COPY apps/web/package.json apps/web/package.json |
| 32 | COPY apps/docs/package.json apps/docs/package.json |
| 33 | COPY packages/db/package.json packages/db/package.json |
| 34 | COPY packages/languages/package.json packages/languages/package.json |
| 35 | RUN bun install --frozen-lockfile --production \ |
| 36 | --filter '@ghost/api' --filter '@ghost/db' --filter '@ghost/languages' |
| 37 | |
| 38 | FROM node:22-slim AS runtime |
| 39 | # Every pack operation shells out to the real git binary. |
| 40 | RUN apt-get update \ |
| 41 | && apt-get install -y --no-install-recommends ca-certificates git \ |
| 42 | && rm -rf /var/lib/apt/lists/* |
| 43 | WORKDIR /app |
| 44 | ENV NODE_ENV=production |
| 45 | COPY --from=prod-deps /app ./ |
| 46 | COPY --from=build /app/apps/api/dist ./apps/api/dist |
| 47 | COPY --from=build /app/packages/db/dist ./packages/db/dist |
| 48 | COPY --from=build /app/packages/languages/dist ./packages/languages/dist |
| 49 | COPY packages/db/drizzle ./packages/db/drizzle |
| 50 | # Statically linked, so the Alpine build runs on this Debian base. |
| 51 | COPY --from=zoekt /usr/local/bin/zoekt-git-index /usr/local/bin/zoekt-git-index |
| 52 | EXPOSE 3001 1031 |
| 53 | CMD ["node", "apps/api/dist/main.js"] |