docker bake files

This commit is contained in:
Max Peintner
2025-07-15 10:12:13 +02:00
parent 8f62f7cf69
commit dcc181ffc8
10 changed files with 78 additions and 20 deletions

View File

@@ -62,6 +62,14 @@ target "login-pnpm" {
} }
} }
target "login-build-base" {
inherits = ["release"]
dockerfile = "${DOCKERFILES_DIR}login-build-base.Dockerfile"
contexts = {
login-pnpm = "target:login-pnpm"
}
}
target "login-dev-base" { target "login-dev-base" {
dockerfile = "${DOCKERFILES_DIR}login-dev-base.Dockerfile" dockerfile = "${DOCKERFILES_DIR}login-dev-base.Dockerfile"
contexts = { contexts = {

View File

@@ -0,0 +1,14 @@
# Base image for building login components with proper dependency caching
FROM login-pnpm AS login-build-base
# Install root workspace dependencies first (best caching)
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
pnpm install --frozen-lockfile --workspace-root --filter .
# Copy all package.json files for dependency resolution
COPY packages/*/package.json ./packages/*/
COPY apps/*/package.json ./apps/*/
# Install all dependencies in one layer for better caching
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
pnpm install --frozen-lockfile

View File

@@ -0,0 +1,14 @@
# .dockerignore for login-build-base
**/.turbo
**/.next
**/node_modules
**/dist
**/build
**/*.log
**/.git
**/coverage
**/.nyc_output
**/cypress/videos
**/cypress/screenshots
**/.env.local
**/.env.*.local

View File

@@ -1,6 +1,9 @@
FROM typescript-proto-client AS login-client FROM typescript-proto-client AS login-client
# Copy package.json first for better dependency caching
COPY packages/zitadel-client/package.json ./packages/zitadel-client/ COPY packages/zitadel-client/package.json ./packages/zitadel-client/
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
pnpm install --frozen-lockfile --workspace-root --filter ./packages/zitadel-client pnpm install --frozen-lockfile --workspace-root --filter ./packages/zitadel-client
# Copy source code
COPY packages/zitadel-client ./packages/zitadel-client COPY packages/zitadel-client ./packages/zitadel-client
# Build the client (equivalent to turbo build for zitadel-client)
RUN cd packages/zitadel-client && pnpm build RUN cd packages/zitadel-client && pnpm build

View File

@@ -1,3 +1,5 @@
FROM login-pnpm AS login-dev-base FROM login-pnpm AS login-dev-base
RUN pnpm install --frozen-lockfile --prefer-offline --workspace-root --filter . # Install all workspace dependencies with caching
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
pnpm install --frozen-lockfile --prefer-offline --workspace-root --filter .

View File

@@ -1,7 +1,10 @@
FROM login-dev-base AS login-lint FROM login-dev-base AS login-lint
# Copy linting configuration files first for better caching
COPY .prettierrc .prettierignore ./ COPY .prettierrc .prettierignore ./
COPY apps/login/package.json apps/login/ COPY apps/login/package.json apps/login/
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
pnpm install --frozen-lockfile --workspace-root --filter apps/login pnpm install --frozen-lockfile --workspace-root --filter apps/login
# Copy source code
COPY . . COPY . .
RUN pnpm lint && pnpm format # Run linting and formatting (equivalent to turbo lint)
RUN cd apps/login && pnpm lint && pnpm exec prettier --check .

View File

@@ -6,5 +6,8 @@ RUN corepack enable && COREPACK_ENABLE_DOWNLOAD_PROMPT=0 corepack prepare pnpm@9
apt-get update && apt-get install -y --no-install-recommends && \ apt-get update && apt-get install -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
WORKDIR /build WORKDIR /build
COPY turbo.json .npmrc package.json pnpm-lock.yaml pnpm-workspace.yaml ./ # Copy package manager configuration files first for better caching
COPY .npmrc package.json pnpm-lock.yaml pnpm-workspace.yaml ./
# turbo.json is needed for workspace structure but not for turbo commands
COPY turbo.json ./
ENTRYPOINT ["pnpm"] ENTRYPOINT ["pnpm"]

View File

@@ -1,17 +1,22 @@
FROM login-client AS login-standalone-builder FROM login-client AS login-standalone-builder
COPY apps/login ./apps/login # Copy package.json files first for better dependency caching
RUN pnpm exec turbo prune @zitadel/login --docker COPY apps/login/package.json ./apps/login/
WORKDIR /build/docker
RUN cp -r ../out/json/* .
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
pnpm install --frozen-lockfile pnpm install --frozen-lockfile --workspace-root --filter ./apps/login
RUN cp -r ../out/full/* .
RUN pnpm exec turbo run build:login:standalone # Copy source code
COPY apps/login ./apps/login
# Build the standalone application
RUN cd apps/login && \
NEXT_PUBLIC_BASE_PATH=/ui/v2/login \
NEXT_OUTPUT_MODE=standalone \
pnpm build
FROM scratch AS login-standalone-out FROM scratch AS login-standalone-out
COPY --from=login-standalone-builder /build/docker/apps/login/.next/standalone / COPY --from=login-standalone-builder /build/apps/login/.next/standalone /
COPY --from=login-standalone-builder /build/docker/apps/login/.next/static /apps/login/.next/static COPY --from=login-standalone-builder /build/apps/login/.next/static /apps/login/.next/static
COPY --from=login-standalone-builder /build/docker/apps/login/public /apps/login/public COPY --from=login-standalone-builder /build/apps/login/public /apps/login/public
FROM node:20-alpine AS login-standalone FROM node:20-alpine AS login-standalone
WORKDIR /runtime WORKDIR /runtime
@@ -21,9 +26,9 @@ RUN addgroup --system --gid 1001 nodejs && \
RUN mkdir -p /.env-file && touch /.env-file/.env && chown -R nextjs:nodejs /.env-file RUN mkdir -p /.env-file && touch /.env-file/.env && chown -R nextjs:nodejs /.env-file
COPY ./scripts/entrypoint.sh ./ COPY ./scripts/entrypoint.sh ./
COPY ./scripts/healthcheck.js ./ COPY ./scripts/healthcheck.js ./
COPY --chown=nextjs:nodejs --from=login-standalone-builder /build/docker/apps/login/.next/standalone ./ COPY --chown=nextjs:nodejs --from=login-standalone-builder /build/apps/login/.next/standalone ./
COPY --chown=nextjs:nodejs --from=login-standalone-builder /build/docker/apps/login/.next/static ./apps/login/.next/static COPY --chown=nextjs:nodejs --from=login-standalone-builder /build/apps/login/.next/static ./apps/login/.next/static
COPY --chown=nextjs:nodejs --from=login-standalone-builder /build/docker/apps/login/public ./apps/login/public COPY --chown=nextjs:nodejs --from=login-standalone-builder /build/apps/login/public ./apps/login/public
USER nextjs USER nextjs
ENV HOSTNAME="0.0.0.0" ENV HOSTNAME="0.0.0.0"
ENV PORT=3000 ENV PORT=3000

View File

@@ -1,6 +1,9 @@
FROM login-client AS login-test-unit FROM login-client AS login-test-unit
# Copy package.json first for better dependency caching
COPY apps/login/package.json ./apps/login/ COPY apps/login/package.json ./apps/login/
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
pnpm install --frozen-lockfile --workspace-root --filter ./apps/login pnpm install --frozen-lockfile --workspace-root --filter ./apps/login
# Copy source code
COPY apps/login ./apps/login COPY apps/login ./apps/login
RUN pnpm test:unit:standalone # Run unit tests (equivalent to turbo test:unit:standalone)
RUN cd apps/login && pnpm test:unit

View File

@@ -1,6 +1,9 @@
FROM login-pnpm AS typescript-proto-client FROM login-pnpm AS typescript-proto-client
# Copy package.json first for better dependency caching
COPY packages/zitadel-proto/package.json ./packages/zitadel-proto/ COPY packages/zitadel-proto/package.json ./packages/zitadel-proto/
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
pnpm install --frozen-lockfile --workspace-root --filter zitadel-proto pnpm install --frozen-lockfile --workspace-root --filter zitadel-proto
# Copy source code
COPY packages/zitadel-proto ./packages/zitadel-proto COPY packages/zitadel-proto ./packages/zitadel-proto
RUN pnpm generate # Generate proto files (equivalent to turbo generate)
RUN cd packages/zitadel-proto && pnpm generate