You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

API Platform 3.2生产构建失败:nuxt命令未找到

API Platform 3.2 部署Nuxt集成应用时 nuxt: not found 错误排查

我在部署集成Nuxt的API Platform 3.2应用时,执行以下部署命令:

SERVER_NAME=your-domain-name.example.com \ APP_SECRET=ChangeMe \ POSTGRES_PASSWORD=ChangeMe \ CADDY_MERCURE_JWT_SECRET=ChangeThisMercureHubJWTSecretKey \ docker compose -f compose.yaml -f compose.prod.yaml up --wait

出现了nuxt: not found的构建错误,具体错误输出如下:

ERROR [pwa builder 4/4] RUN PNPM install --frozen-lockfile --offline --prod &&  pnpm run build                                                                                                     4.9s

> [pwa builder 4/4] RUN        PNPM install --frozen-lockfile --offline --prod &&      pnpm run build: 
> 3.272 ? The modules directory at "/srv/app/node_modules" will be removed and reinstalled from scratch. Proceed? (Y/n) ‣ true  
> 4.190 > nuxt-app@ build /srv/app  
> 4.190 > nuxt build  
> 4.190  
> 4.196 sh: 1: nuxt: not found
> `4.199  ELIFECYCLE  Command failed.

------
failed to solve: process "/bin/sh -c pnpm install --frozen-lockfile --offline --prod && \tpnpm run build" did not complete successfully: exit code: 1

我的pwa/Dockerfile内容如下:

#syntax=docker/dockerfile:1.4

# Versions

FROM node:lts AS node_upstream

# Base stage for dev and build

FROM node_upstream AS base

WORKDIR /srv/app

RUN corepack enable && \
corepack prepare --activate pnpm@latest && \
pnpm config -g set store-dir /.pnpm-store

# Development image

FROM base as dev

EXPOSE 3000
ENV PORT 3000
ENV HOSTNAME localhost

CMD ["sh", "-c", "pnpm install; pnpm dev"]

FROM base AS builder

COPY --link pnpm-lock.yaml ./
RUN pnpm fetch --prod

COPY --link . .

RUN pnpm install --frozen-lockfile --offline --prod && \
pnpm run build

# Production image, copy all the files and run nuxt

FROM node_upstream AS prod

WORKDIR /srv/app

ENV NODE_ENV production

RUN addgroup --system --gid 1001 nodejs; \
adduser --system --uid 1001 nuxt

COPY --from=builder --link /srv/app/public ./public

USER nuxt

EXPOSE 3000

ENV PORT 3000
ENV HOSTNAME localhost

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

compose.prod.yaml内容如下:

# Production environment override
services:
php:
build:
context: ./api
target: frankenphp_prod
environment:
APP_SECRET: ${APP_SECRET}
MERCURE_PUBLISHER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET}
MERCURE_SUBSCRIBER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET}

pwa:
build:
context: ./pwa
target: prod

database:
environment:
MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}

这是我首次部署API Platform生产环境,尝试直接在pwa目录执行pnpm install也未解决问题,求协助。


问题根源

错误nuxt: not found是因为在builder阶段使用--prod参数安装依赖时,Nuxt CLI工具(nuxt命令)属于开发依赖,不会被安装,导致执行pnpm run build时找不到命令。

此外Dockerfile还存在两个额外问题:

  1. prod阶段仅复制了public目录,缺少Nuxt构建后的.output目录和启动所需文件,启动时会报错
  2. pnpm fetch --prod仅拉取生产依赖,后续无法获取构建必需的开发依赖

修复方案

1. 修改builder阶段的依赖安装逻辑

去掉pnpm fetch和pnpm install的--prod参数,确保安装包括Nuxt CLI在内的所有依赖:

FROM base AS builder

COPY --link pnpm-lock.yaml ./
# 去掉--prod,拉取所有依赖
RUN pnpm fetch

COPY --link . .

# 去掉--prod,安装所有依赖(含开发依赖)
RUN pnpm install --frozen-lockfile --offline && \
pnpm run build

2. 完善prod阶段的文件复制

Nuxt构建完成后会生成.output目录(核心运行文件),需要将其复制到生产镜像中:

FROM node_upstream AS prod

WORKDIR /srv/app

ENV NODE_ENV production

RUN addgroup --system --gid 1001 nodejs; \
adduser --system --uid 1001 nuxt

# 复制构建后的核心输出目录及必要文件
COPY --from=builder --link /srv/app/.output ./
COPY --from=builder --link /srv/app/public ./public

USER nuxt

EXPOSE 3000

ENV PORT 3000
ENV HOSTNAME localhost

# Nuxt 3默认启动命令,根据实际项目调整
CMD ["node", ".output/server/index.mjs"]

3. 可选:优化生产镜像体积(仅保留生产依赖)

如果希望生产镜像只包含运行必需的生产依赖,可以新增一个prod-deps阶段单独安装生产依赖:

FROM base AS builder

COPY --link pnpm-lock.yaml ./
RUN pnpm fetch

COPY --link . .
RUN pnpm install --frozen-lockfile --offline && \
pnpm run build

# 新增阶段:仅安装生产依赖
FROM base AS prod-deps

COPY --link pnpm-lock.yaml ./
RUN pnpm fetch --prod
RUN pnpm install --frozen-lockfile --offline --prod

# 生产镜像使用prod-deps的依赖
FROM node_upstream AS prod

WORKDIR /srv/app

ENV NODE_ENV production

RUN addgroup --system --gid 1001 nodejs; \
adduser --system --uid 1001 nuxt

COPY --from=prod-deps --link /srv/app/node_modules ./node_modules
COPY --from=builder --link /srv/app/.output ./
COPY --from=builder --link /srv/app/public ./public

USER nuxt

EXPOSE 3000

ENV PORT 3000
ENV HOSTNAME localhost

CMD ["node", ".output/server/index.mjs"]

内容的提问来源于stack exchange,提问作者Victoria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:10:34