Docker构建时出现‘Text file busy’错误的排查求助
node-pre-gyp: Text file busy的本地独有问题 问题背景
本地执行docker build --pull --no-cache .时,npm安装依赖(如canvas、@ory/cli)阶段出现npm ERR! sh: 1: node-pre-gyp: Text file busy错误,其他机器可正常构建;已使用overlay2存储驱动,无法修改第三方包的安装脚本注入sleep。Docker版本24.0.0,宿主机为Ubuntu 22.04.2 LTS。
可行解决方案
1. 彻底清理Docker系统缓存
执行以下命令清理所有无用的容器、镜像、构建缓存和卷:
docker system prune -af
清理完成后重新尝试构建,可消除因缓存损坏导致的异常。
2. 调整Overlay2存储驱动配置
编辑Docker守护进程配置文件/etc/docker/daemon.json(不存在则创建),添加metacopy启用配置:
{ "storage-driver": "overlay2", "storage-opts": ["overlay2.metacopy=true"] }
保存后重启Docker服务:
sudo systemctl restart docker
metacopy模式会改变Overlay2的文件复制方式,可解决文件占用冲突问题。
3. 更换Node基础镜像版本
将Dockerfile中的node:slim替换为指定稳定版本,例如:
FROM node:18-slim WORKDIR /app COPY ./package.json ./ RUN npm install
不同版本的Node镜像可能包含不同的npm或系统依赖版本,可避开当前镜像中存在的文件系统交互bug。
4. 强制本地构建绕过预编译包
修改Dockerfile中的npm install命令,添加--build-from-source参数,强制跳过预编译包下载,直接本地构建依赖:
FROM node:slim WORKDIR /app COPY ./package.json ./ RUN npm install --build-from-source
此方法避免调用node-pre-gyp下载预编译文件,从根源绕开文件占用问题。
5. 检查宿主机文件系统健康
停止Docker服务:
sudo systemctl stop docker
检查Docker数据目录(默认/var/lib/docker)所在分区的文件系统:
sudo fsck /dev/[你的分区设备名]
注意:执行fsck前需确保分区已卸载,避免损坏数据。文件系统错误可能导致Docker构建时出现文件占用异常。
内容的提问来源于stack exchange,提问作者Mateusz Kraiński

