Files
lifeforge/docker/db-init/Dockerfile

77 lines
2.6 KiB
Docker

# syntax=docker/dockerfile:1
# ============================================
# Get PocketBase binary from official image
# ============================================
FROM ghcr.io/muchobien/pocketbase:latest AS pocketbase
# ============================================
# Builder stage - build forge CLI
# ============================================
FROM oven/bun:alpine AS builder
WORKDIR /app
# Copy source
COPY . .
# Install dependencies
RUN --mount=type=cache,target=/root/.bun/install/cache \
bun install --frozen-lockfile --linker isolated
# Build @lifeforge/log (required by tools)
RUN cd /app/packages/lifeforge-log && bun run build
# Build @lifeforge/server-utils (required by schema files)
RUN cd /app/packages/lifeforge-server-utils && bun run build
# Build forge CLI
RUN cd /app/tools && bun run build
# Collect only schema files to staging directory
RUN mkdir -p /schemas && \
find /app/server/src/lib -name "schema.ts" -exec sh -c 'mkdir -p /schemas/$(dirname ${1#/app/}) && cp "$1" /schemas/$(dirname ${1#/app/})/' _ {} \;
# ============================================
# Production stage - minimal runtime
# ============================================
FROM oven/bun:alpine
# Copy PocketBase binary from official image
COPY --from=pocketbase /usr/local/bin/pocketbase /usr/local/bin/pocketbase
WORKDIR /app
# Copy ONLY bundled forge CLI (no node_modules!)
COPY --from=builder /app/tools/dist/forge.js ./forge.js
# Copy server schema files needed for migration generation
COPY --from=builder /schemas/server/src/lib ./server/src/lib
# Copy shared package (built) for schema imports
COPY --from=builder /app/shared/dist ./shared/dist
COPY --from=builder /app/shared/package.json ./shared/package.json
# Copy @lifeforge/server-utils (required by schema files)
COPY --from=builder /app/packages/lifeforge-server-utils/dist ./packages/lifeforge-server-utils/dist
COPY --from=builder /app/packages/lifeforge-server-utils/package.json ./packages/lifeforge-server-utils/package.json
# Create node_modules symlinks for package resolution
RUN mkdir -p node_modules/@lifeforge && \
ln -sf /app/shared node_modules/shared && \
ln -sf /app/packages/lifeforge-server-utils node_modules/@lifeforge/server-utils
# Install minimal dependencies for schema evaluation
RUN echo '{"dependencies":{"zod":"^4.0.0"}}' > package.json && bun install
# Set environment for Docker mode
ENV DOCKER_MODE=true
ENV PB_DIR=/pb_data
ENV PB_BINARY_PATH=/usr/local/bin/pocketbase
# Copy entrypoint
COPY docker/db-init/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]