docker-compose部署Vue应用报vue-cli-service缺失问题排查
这报错和你重复安装多少遍全局依赖都没关系,核心是容器构建阶段装好的依赖被宿主机挂载目录覆盖了,两边环境表现不一致纯粹是Docker Compose版本逻辑差异导致的:
- 你的Dockerfile在镜像构建阶段执行
yarn install,已经把vue-cli-service、babel相关依赖全部装到了镜像内的/code/node_modules路径下 - Compose配置里写了
./frontend/:/code/全量目录挂载,Ubuntu上装的独立版Compose V1(1.29.2)启动时会直接把宿主机frontend目录整个覆盖容器内的/code目录:要么你宿主机上没装node_modules,要么本地装的是适配Arch环境的二进制依赖,直接把镜像里提前装好的Linux版依赖盖没了,自然找不到对应命令 - 本地Arch用的Compose V2默认给node_modules目录做了隐式空卷保护,不会被宿主机挂载内容覆盖,所以本地跑完全正常;手动执行docker build+docker run的时候没有加目录挂载参数,当然也能正常跑。那些找不到yarn.lock、依赖弃用警告都是依赖被覆盖后,容器触发了重新解析安装依赖的流程出的提示,不是问题根因。
三个方案选一个即可,都能彻底解决问题:
方案1(和本地环境完全对齐,最省事)
直接把Ubuntu上的旧版Compose V1卸掉,安装Docker官方的Compose V2插件,和你本地Arch的运行环境保持一致,后续操作命令从docker-compose换成docker compose即可。
操作命令:
# 卸载旧版独立Compose sudo apt remove -y docker-compose sudo rm -f /usr/local/bin/docker-compose # 安装Compose V2插件(已配置Docker官方源可直接装,未配置的先添加Docker官方软件源) sudo apt install -y docker-compose-plugin # 验证安装结果 docker compose version
装完在项目目录执行docker compose up --build -d即可正常启动服务。
方案2(不换Compose版本,改配置兼容V1)
修改docker-compose.yml里的frontend服务卷配置,单独给node_modules加匿名卷挂载规则,避免被宿主机目录覆盖,改完的volumes配置段如下:
volumes: - ./frontend/:/code/ - /code/node_modules
这个配置的逻辑是:除node_modules目录外,其他前端代码正常挂载支持本地改代码热更新,容器内的依赖目录用独立卷存储,不会被宿主机的同名文件覆盖,Compose V1和V2都能兼容。改完执行docker-compose up --build -d即可。
方案3(测试/生产环境不需要热更新时使用)
直接删掉volumes配置里的本地目录挂载规则,构建镜像时就把全量代码拷进镜像,启动时完全用镜像内的文件运行,不存在挂载覆盖的问题,稳定性最高,适合不需要频繁修改代码的部署场景。
启动后如果要确认问题是否解决,进容器检查依赖是否存在即可:
# Compose V2执行 docker compose exec frontend ls /code/node_modules/@vue/cli-service # Compose V1执行 docker-compose exec frontend ls /code/node_modules/@vue/cli-service
能返回文件列表就说明依赖正常,服务可以正常运行。日志里的依赖弃用警告都是上游包的版本提示,不影响实际功能,不需要特意处理。
内容的提问来源于stack exchange,提问作者tanbog

