You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:58:01