Dockerfile修改容器/etc/hosts权限报错不生效的解决方法
根本原因
在Dockerfile中修改/etc/hosts权限失败是Docker的机制决定的:
- 镜像构建阶段,
/etc/hosts是Docker引擎临时挂载的只读文件,不属于镜像可写层,所有针对该文件的修改、权限调整操作都会触发只读报错 - 即便绕过构建阶段的报错,容器启动时Docker会重新生成全新的
/etc/hosts文件,覆盖镜像内存储的对应文件,之前做的权限、属主修改会全部失效
补充:你贴的配置存在指令笔误,Dockerfile中切换用户的指令是USER,不是USE
可行方案
方案1:使用Docker原生hosts配置(推荐,无需调整权限)
如果需求是添加hosts解析记录,完全不需要手动修改文件、调整权限,直接用Docker提供的原生参数即可,引擎会自动把记录写入运行时的/etc/hosts。
- 命令行启动容器时,添加
--add-host参数:
docker run -d --add-host service.test:10.0.0.25 你的镜像标签
- 使用docker-compose部署时,在服务配置中添加
extra_hosts字段:
services: app: image: 你的镜像标签 extra_hosts: - "service.test:10.0.0.25"
该方案不需要给文件提权,兼容性最好,不受Docker版本变动影响。
方案2:通过入口脚本在运行时调整权限
如果确实需要给指定普通用户开放/etc/hosts的编辑权限,不要在Dockerfile的RUN阶段操作,把权限调整逻辑放到容器启动入口脚本中——此时容器已经进入运行态,/etc/hosts为可读写状态,修改不会报错。
- 新建入口脚本
entrypoint.sh,内容如下:
#!/bin/sh # 二选一即可:要么修改属主,要么直接改权限为744 chown <目标用户名>:<目标用户组> /etc/hosts # chmod 744 /etc/hosts # 执行原有容器启动命令 exec "$@"
- 给脚本添加本地执行权限后,在Dockerfile中添加如下配置:
USER root COPY entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh # 切换回业务运行使用的普通用户 USER <你的业务运行用户> ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] CMD ["你的业务服务启动命令"]
容器每次启动时都会自动完成权限调整,配置在整个容器运行周期内有效。
方案3:运行中容器临时调整
如果是已经启动的存量容器,不需要重启的话,可以直接通过docker exec以root身份执行权限修改命令:
# 修改属主 docker exec -u root 运行中的容器名/容器ID chown <目标用户>:<目标组> /etc/hosts # 修改权限为744 # docker exec -u root 运行中的容器名/容器ID chmod 744 /etc/hosts
该方式修改的权限仅在当前容器运行周期有效,容器删除重建后会失效,适合临时调试场景。
内容的提问来源于stack exchange,提问作者Amit Singh
相关产品推荐
相关产品推荐

