Next.js 14.2.1在BitBucket CI/CD部署Docker镜像时缓存密钥计算失败
Next.js 14.2.1 BitBucket CI/CD Docker构建报错解决
问题描述
- 基于Next.js 14.2.1的应用,本地Docker构建、Docker Compose启动均正常
- 推送到BitBucket触发CI/CD部署时,持续报错:
failed to compute cache key: failed to calculate checksum of ref 477c9fb1-28c9-4045-a9cc-08a7673e4c97::u2nyjtgnhu6dp1afwar29xnmk: "/app/.next/standalone": not found
- 当前使用的Dockerfile内容:
FROM node:18-alpine AS base # Install dependencies only when needed FROM base AS deps RUN apk add --no-cache libc6-compat WORKDIR /app COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ RUN yarn install RUN yarn add sharp --ignore-engines # Rebuild the source code only when needed FROM base AS builder WORKDIR /app ENV NEXT_PRIVATE_STANDALONE true COPY --from=deps /app/node_modules ./node_modules COPY . . RUN \ if [ -f yarn.lock ]; then yarn build; \ elif [ -f package-lock.json ]; then npm run build; \ elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ else echo "Lockfile not found." && exit 1; \ fi # Production image, copy all the files and run next FROM base AS runner WORKDIR /app RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs RUN mkdir .next RUN chown nextjs:nodejs .next COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static USER nextjs EXPOSE 4000 ENV PORT=4000 CMD ["node", "server.js"]
期望替换为官方标准Dockerfile后,能在BitBucket CI/CD中成功构建。
解决步骤
1. 明确开启Next.js Standalone输出
在next.config.js中添加output: 'standalone'配置,确保构建时强制生成.next/standalone目录:
/** @type {import('next').NextConfig} */ const nextConfig = { output: 'standalone', } module.exports = nextConfig
仅依赖环境变量NEXT_PRIVATE_STANDALONE=true可能在CI环境中存在兼容问题,配置文件声明是官方推荐的可靠方式。
2. 检查Dockerignore规则
确保.dockerignore没有排除.next/standalone和.next/static目录,建议调整为:
# 只排除不需要的缓存和临时文件 .next/cache .next/trace node_modules npm-debug.log* yarn-debug.log* yarn-error.log*
3. 简化Dockerfile构建逻辑
将builder阶段的多包管理器判断改为明确的yarn build(因你使用yarn管理依赖),避免分支判断引发的潜在问题:
FROM base AS builder WORKDIR /app ENV NEXT_PRIVATE_STANDALONE true COPY --from=deps /app/node_modules ./node_modules COPY . . # 直接执行yarn build,无需冗余判断 RUN yarn build
可在CI构建步骤中添加目录检查,确认构建产物生成:
# 在builder阶段的RUN yarn build后添加 RUN ls -la /app/.next/
4. 替换为官方标准Dockerfile
使用适配Next.js 14的官方Dockerfile,确保兼容性并调整端口为4000:
FROM node:18-alpine AS base # Install dependencies only when needed FROM base AS deps RUN apk add --no-cache libc6-compat WORKDIR /app COPY package.json yarn.lock* ./ RUN yarn --frozen-lockfile # Rebuild the source code only when needed FROM base AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . ENV NEXT_TELEMETRY_DISABLED 1 ENV NEXT_PRIVATE_STANDALONE true RUN yarn build # Production image, copy all the files and run next FROM base AS runner WORKDIR /app ENV NODE_ENV production ENV NEXT_TELEMETRY_DISABLED 1 RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs RUN mkdir .next RUN chown nextjs:nodejs .next COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static COPY --from=builder --chown=nextjs:nodejs /app/public ./public USER nextjs EXPOSE 4000 ENV PORT 4000 CMD ["node", "server.js"]
5. 启用Docker BuildKit
在BitBucket CI的构建命令中启用BuildKit,避免旧版本Docker的缓存计算问题:
DOCKER_BUILDKIT=1 docker build -t your-app-image .
内容的提问来源于stack exchange,提问作者Damilola Ogunboyejo
相关产品推荐
相关产品推荐

