Docker Compose启动npm容器报sh:1:mix:not found错误求助
问题根因
你在Docker镜像构建阶段执行的npm install生成的node_modules目录,被docker-compose的本地挂载卷覆盖了。
你在npm.dockerfile中构建镜像时,已经将依赖安装到了镜像内的/var/www/html/node_modules路径,但docker-compose.yml中npm服务的volumes配置将本地./src目录挂载到了容器的/var/www/html路径,若本地./src下没有node_modules,容器启动后镜像内置的node_modules会被本地空目录覆盖,导致找不到mix等可执行文件,才需要手动进入容器重新安装。
可用解决方案
方案1:调整挂载规则,屏蔽node_modules目录覆盖(推荐)
在npm服务的volumes配置中新增一条匿名卷挂载规则,专门用于保留容器内的node_modules目录,避免被本地目录覆盖:
npm: tty: true build: context: . dockerfile: npm.dockerfile container_name: npm-aws volumes: - ./src:/var/www/html - /var/www/html/node_modules # 新增此行,优先使用容器内的node_modules working_dir: /var/www/html command: npm run watch-poll networks: - laravel
该方案无需修改镜像,也不会额外增加启动耗时,同时本地的业务代码修改仍然可以实时同步到容器内,适合开发场景使用。
方案2:启动时自动执行依赖安装
修改npm服务的启动命令,每次容器启动时先执行依赖安装再运行服务:
npm: tty: true build: context: . dockerfile: npm.dockerfile container_name: npm-aws volumes: - ./src:/var/www/html working_dir: /var/www/html command: sh -c "npm install && npm run watch-poll" networks: - laravel
该方案的优势是每次启动都会自动同步package.json的变更,无需每次修改依赖后重新构建镜像,缺点是每次启动都会执行安装逻辑,启动速度会变慢。
方案3:优化Dockerfile逻辑
另外你当前的npm.dockerfile存在冗余配置,npm install和npm clean-install(即npm ci)执行两次安装,可以简化为更稳定的版本:
FROM node:14.17.1 WORKDIR /var/www/html COPY ./src/package*.json . # 同时复制package.json和package-lock.json保证版本一致 RUN npm ci # 优先使用npm ci安装,版本更固定 CMD ["npm", "run", "watch-poll"]
内容的提问来源于stack exchange,提问作者YaBCK
相关产品推荐
相关产品推荐

