Dokploy的 Next.js Dockerfile在 ISR中不起作用

前端开发 2026-07-09

我在Dokploy上构建Next.js的 Dockerfile。它在大多数情况下工作正常,但如果我的Next.js构建在构建阶段需要Prisma,就会失败,因为Dockerfile没有把DATABASE_URL传递给Prisma。我该怎么办?我已把它添加到构建阶段的机密中。如果把URL硬编码进Dockerfile,就能工作。

# syntax=docker/dockerfile:1

FROM node:22-alpine AS deps

WORKDIR /app

COPY package.json package-lock.json ./

RUN npm ci

# =====================================

FROM node:22-alpine AS builder

WORKDIR /app

COPY --from=deps /app/node_modules ./node_modules
COPY . .

ARG DATABASE_URL
ENV DATABASE_URL=$DATABASE_URL


ENV NODE_ENV=production

RUN npx prisma generate

RUN echo "DATABASE_URL=$DATABASE_URL"

RUN npm run build

# =====================================

FROM node:22-alpine AS runner

WORKDIR /app

ENV NODE_ENV=production
ENV PORT=3000
ENV HOSTNAME=0.0.0.0

RUN addgroup -S nodejs && \
    adduser -S nextjs -G nodejs

COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public

COPY --from=builder /app/prisma ./prisma
COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma

USER nextjs

EXPOSE 3000

CMD ["node", "server.js"]

解决方案

问题在于Dokploy在构建阶段将环境变量注入为Docker的 Build Arguments (--build-arg),但你的Dockerfile需要在执行Prisma生成或Next.js编译等任务之前,明确地被告知去查找它们。

具体修复

ARG DATABASE_URL 这一行向上移动,使其在你运行 npx prisma generatenpm run build 之前被求值。

按照下面的方式更新你的 builder 阶段:

FROM node:22-alpine AS builder

WORKDIR /app

COPY --from=deps /app/node_modules ./node_modules

COPY . .

# 1. Declare the ARG so Docker pulls it from Dokploy's build secrets

ARG DATABASE_URL

# 2. Assign it to an ENV variable so Prisma and Next.js can see it during build time

ENV DATABASE_URL=$DATABASE_URL

ENV NODE_ENV=production

# 3. Now run your build commands

RUN npx prisma generate

RUN npm run build

为什么会这样:

在Docker中,ARG 变量仅在它们被声明的特定阶段可用,且必须在依赖它们的命令执行之前被声明。通过在Prisma和构建步骤之前明确放置 ARG DATABASE_URLENV DATABASE_URL=$DATABASE_URL,Docker就能够将Dokploy的构建时机密正确传递到环境中。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章