AdonisJS 5 Docker部署运行报错Cannot find ace问题求助
问题根因
共有3处配置错误直接导致ace命令找不到,另有1处生产环境启动隐患:
- 卷挂载路径错误:你的
docker-compose.yml存放在项目根目录,fn_service的构建上下文是./service(即AdonisJS项目实际存放在根目录下的service文件夹中),但卷配置写的是- ./:/home/node/app——这会把宿主机的项目根目录直接覆盖容器内的/home/node/app工作目录,容器内根本读不到service文件夹下的ace、项目源码等文件,直接触发模块找不到的报错。 - 多余的旧版本CLI安装:AdonisJS 5的
ace不需要全局安装@adonisjs/cli,这个包是AdonisJS 4版本的旧工具,v5版本ace是项目内置的可执行文件,安装旧包反而会引发版本冲突。 - 生产启动命令路径错误:Dockerfile里production阶段的CMD写的是
node service/build/server.js,但build阶段已经把编译产物拷贝到工作目录根路径,多余的service/前缀会导致生产镜像启动时也报文件不存在错误。
修复步骤
1. 修正docker-compose.yml的卷挂载配置
找到fn_service服务下的volumes配置段,把原来的根目录挂载改为指向实际的Adonis项目目录,修改后配置如下:
volumes: - ./service:/home/node/app - /home/node/app/node_modules
注:第二条匿名卷配置作用是保留容器内安装的node_modules,避免被宿主机不同系统环境下的node_modules(二进制依赖不兼容)覆盖,该配置逻辑正确无需修改。
2. 修正Dockerfile配置
首先删除dependencies阶段多余的RUN npm i @adonisjs/cli行,再修正production阶段的CMD启动路径,修改完成的完整Dockerfile如下:
ARG NODE_IMAGE=node:16.13.1-alpine FROM $NODE_IMAGE AS base RUN apk --no-cache add dumb-init RUN mkdir -p /home/node/app && chown node:node /home/node/app WORKDIR /home/node/app USER node RUN mkdir tmp FROM base AS dependencies COPY --chown=node:node ./package*.json ./ RUN npm ci COPY --chown=node:node . . FROM dependencies AS build RUN node ace build --production FROM base AS production ENV NODE_ENV=production ENV PORT=$PORT ENV HOST=0.0.0.0 COPY --chown=node:node ./package*.json ./ RUN npm ci --production COPY --chown=node:node --from=build /home/node/app/build . EXPOSE $PORT CMD [ "dumb-init", "node", "server.js" ]
3. 清理缓存重启验证
执行以下命令清理旧的构建缓存、已停止容器和匿名卷,重新构建启动服务:
docker-compose down -v docker-compose up --build
正常启动后fn_service会正确识别ace文件,进入watch模式运行服务。
补充排查手段
如果修改后仍报ace找不到,可以进容器手动校验文件状态:
- 先把docker-compose里
fn_service的command临时改成sleep 3000,重启容器 - 执行
docker exec -it fn_service sh进入容器交互shell - 执行
ls -la查看工作目录下的文件,确认ace文件存在且有可执行权限,若权限不足执行chmod +x ace即可修复。
内容的提问来源于stack exchange,提问作者Daechir
相关产品推荐
相关产品推荐

