Docker Hyper-V环境运行laravel-mix出现webpack-cli EEXIST文件已存在错误
问题根因
- Laravel Mix是单例设计模式,你在
webpack.mix.js中重复导入两次生成了两个独立实例,两套构建流程会同时处理静态资源,重复写入目标图片文件。WSL2的文件锁机制相对宽松未触发报错,Hyper-V下Windows共享卷的文件锁规则更严格,重复写入直接抛出EEXIST错误。 - Docker for Windows在Hyper-V模式下,挂载卷的文件覆盖权限校验比WSL2更严格,你没有配置Mix允许覆盖已存在的静态文件,同时npm容器默认以root身份运行,生成的文件权限和web目录的laravel用户权限不匹配,也会触发写入冲突。
修复步骤
1. 修复webpack.mix.js的重复实例问题
删除重复的Mix导入,替换所有oldMix引用为同一个mix实例:
// 只保留这一句导入,删除const oldMix = require('laravel-mix');那行 const mix = require('laravel-mix'); const path = require('path'); const glob = require('glob'); const PurgeCSSPlugin = require('purgecss-webpack-plugin'); // 后面所有的oldMix全部替换成mix即可
2. 新增Mix配置允许覆盖静态文件
修改mix.options配置块,增加文件覆盖相关配置:
mix.options({ postCss: [ require('autoprefixer'), ], fileLoaderDirs: { fonts: 'website/fonts', images: 'website/images' }, // 新增以下配置 processCssUrls: false, fileLoaderOptions: { overwrite: true } });
3. 调整Docker npm容器权限
修改docker-compose.yml中的npm服务配置,对齐laravel用户的uid/gid,避免生成的文件权限冲突:
npm: image: node:14.17.1 tty: true container_name: npm-aws user: "1000:1000" # 新增这行 volumes: - ./src:/var/www/html - /var/www/html/node_modules working_dir: /var/www/html entrypoint: ['npm'] networks: - laravel
4. 清理缓存重新构建
执行以下命令清理历史构建产物,重新运行mix命令:
# 清理现有构建文件 docker-compose run --rm npm rm -rf public/website public/old/Build public/mix-manifest.json # 重新构建npm容器 docker-compose build npm # 测试构建 docker-compose run --rm npm run production
内容的提问来源于stack exchange,提问作者YaBCK
相关产品推荐
相关产品推荐

