最近使用dockerfile 对 nuxt3项目的ssr模式进行构建。
原本的思路是构建结束后,使用pnpm prune --production把开发依赖给删除,但是会触发nuxt prepare钩子提示我某个开发依赖没有安装,但我都构建结束,已经不需要开发依赖了。
FROM node:18-alpine as builder
WORKDIR /app
COPY package*.json ./
COPY pnpm-lock.yaml ./
RUN npx pnpm install --frozen-lockfile
COPY . .
RUN npx pnpm run build
RUN pnpm prune --production
后来我尝试删除node_modules,只安装生产依赖,却发现依然会触发nuxt prepare钩子
RUN rm -rf node_modules
RUN npx pnpm install --frozen-lockfile
但是在生产构建的时候没有执行过pnpm i,直接下载生产依赖,却不会触发nuxt prepare
FROM node:18-alpine as production
WORKDIR /app
COPY --from=builder /app/pnpm-lock.yaml ./
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/.output ./.output
RUN npx pnpm install --frozen-lockfile --production
EXPOSE 80
CMD ["node", ".output/server/index.mjs"]
可见只要执行加载nuxt ,脚本就会记录在内存中,删除node_modules也没有用,使用--ignore-scripts忽略脚本,即可解决nuxt prepare钩子的问题
#==================构建=======================
FROM node:18-alpine as builder
WORKDIR /app
COPY package*.json ./
COPY pnpm-lock.yaml ./
RUN npx pnpm install --frozen-lockfile
COPY . .
RUN npx pnpm run build
RUN npx pnpm prune --production --ignore-scripts
#==================生产=======================
FROM node:18-alpine as production
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/.output ./.output
EXPOSE 80
CMD ["node", ".output/server/index.mjs"]