Docker容器执行命令报sed无法重命名/etc/hosts设备或资源忙错误
报错信息
sed: cannot rename /etc/hosts: Device or resource busy
问题场景
在Docker容器内搭建开发环境,执行以下安装命令时触发上述报错:
./install && source $([ $SHELL = "/bin/zsh" ] && echo ~/.zshrc || echo ~/.bashrc);
运行环境
- Docker Desktop: 4.9.1 (81317)
- 容器内系统:Ubuntu 20.04.4 LTS
- 宿主机系统:Windows 11 Home

报错根因
Docker容器内的/etc/hosts是Docker守护进程直接绑定挂载的特殊管理文件,不属于容器内普通可自由操作的磁盘文件。
默认sed -i的原地修改逻辑是:先生成写入修改内容的临时文件,再通过rename系统调用把临时文件替换掉原文件。而绑定挂载的/etc/hosts本身被Docker进程占用,不允许执行替换inode的rename操作,就会抛出「设备或资源忙」的错误。
解决方案
找到install脚本中所有修改/etc/hosts的sed -i命令,替换为「先输出修改内容到临时文件,再直接覆盖写回原文件」的逻辑即可,全程不触发文件重命名操作。
举个例子,如果原脚本里的写法是:
sed -i 's/127.0.0.1 localhost/127.0.0.1 localhost test-dev/' /etc/hosts
替换为以下写法就能正常执行:
# 先把修改后的内容输出到临时文件 sed 's/127.0.0.1 localhost/127.0.0.1 localhost test-dev/' /etc/hosts > /tmp/hosts.tmp # 直接覆盖原/etc/hosts的内容,不替换文件本身 cat /tmp/hosts.tmp > /etc/hosts # 清理临时文件 rm -f /tmp/hosts.tmp
如果不想手动修改脚本,也可以在启动容器时添加--privileged特权参数获得更高的挂载操作权限,但这种方式安全风险更高,优先推荐修改脚本逻辑的方案。
内容的提问来源于stack exchange,提问作者Abdullah Ramzan
相关产品推荐
相关产品推荐

