Dokploy的 Next.js Dockerfile在 ISR中不起作用
我在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 generate 和 npm 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_URL 和 ENV DATABASE_URL=$DATABASE_URL,Docker就能够将Dokploy的构建时机密正确传递到环境中。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。