diff --git a/Dockerfile b/Dockerfile index 2429ab2..9933f5b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,40 +1,11 @@ -FROM arm64v6/node:22 AS base -ENV SHARP_IGNORE_GLOBAL_CLI_BINARIES=1 -ENV VIPS_DISABLE_DEPS=1 -ENV PNPM_SCRIPT_RUNNER_ALLOW_BUILD=true -RUN corepack enable +FROM node:22-alpine WORKDIR /app - -FROM base AS builder -COPY package.json pnpm-lock.yaml ./ -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile --dangerously-allow-all-builds -COPY . . -# ^ copy source code -RUN --mount=type=cache,target=/app/.vinxi pnpm run build -# ^ produces .output (build artifact) and .vinxi (build cache) - - -FROM base AS production_builder -RUN apt-get update && apt-get install -y jq -COPY --from=builder /app/package.json ./ -RUN jq 'del(.devDependencies)' package.json > package.prod.json -COPY --from=builder /app/pnpm-lock.yaml ./ -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile --dangerously-allow-all-builds - -# Prod image -FROM arm64v6/node:22-alpine -ENV SHARP_IGNORE_GLOBAL_CLI_BINARIES=1 -ENV VIPS_DISABLE_DEPS=1 -ENV PNPM_SCRIPT_RUNNER_ALLOW_BUILD=true -RUN corepack enable -WORKDIR /app - -COPY --from=production_builder /app/package.prod.json ./package.json -COPY --from=production_builder /app/pnpm-lock.yaml ./pnpm-lock.yaml -RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile --dangerously-allow-all-builds - -COPY --from=builder /app/.output ./.output - EXPOSE 3000 -CMD ["npm", "run", "start"] \ No newline at end of file +COPY package.json ./ +RUN --mount=type=cache,target=/root/.npm npm install + +COPY . . +RUN --mount=type=cache,target=/app/.vinxi npm run build + +CMD ["npm", "run", "start"] diff --git a/Dockerfile.stages b/Dockerfile.stages new file mode 100644 index 0000000..8fa1d71 --- /dev/null +++ b/Dockerfile.stages @@ -0,0 +1,40 @@ +FROM arm64v8/node:22 AS base +ENV SHARP_IGNORE_GLOBAL_CLI_BINARIES=1 +ENV VIPS_DISABLE_DEPS=1 +ENV PNPM_SCRIPT_RUNNER_ALLOW_BUILD=true +RUN corepack enable +WORKDIR /app + +FROM base AS builder +COPY package.json pnpm-lock.yaml ./ +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile --dangerously-allow-all-builds +COPY . . +# ^ copy source code +RUN --mount=type=cache,target=/app/.vinxi pnpm run build +# ^ produces .output (build artifact) and .vinxi (build cache) + + +FROM base AS production_builder +RUN apt-get update && apt-get install -y jq +COPY --from=builder /app/package.json ./ +RUN jq 'del(.devDependencies)' package.json > package.prod.json +COPY --from=builder /app/pnpm-lock.yaml ./ +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile --dangerously-allow-all-builds + +# Prod image +FROM arm64v8/node:22-alpine +ENV SHARP_IGNORE_GLOBAL_CLI_BINARIES=1 +ENV VIPS_DISABLE_DEPS=1 +ENV PNPM_SCRIPT_RUNNER_ALLOW_BUILD=true +RUN corepack enable +WORKDIR /app + +COPY --from=production_builder /app/package.prod.json ./package.json +COPY --from=production_builder /app/pnpm-lock.yaml ./pnpm-lock.yaml +RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile + +COPY --from=builder /app/.output ./.output + +EXPOSE 3000 + +CMD ["npm", "run", "start"] \ No newline at end of file