Fedora下Podman部署ISC Bind9容器的权限问题排查
Bind9容器权限问题解决办法
问题背景
在Fedora系统用Podman运行基于Debian的官方ISC Bind9容器时,出现权限错误:
09-Nov-2024 21:26:44.329 the working directory is not writable
09-Nov-2024 21:26:44.330 loading configuration: permission denied
09-Nov-2024 21:26:44.330 exiting (due to fatal error)
容器默认ENTRYPOINT以bind用户(UID100、GID101)运行named,已尝试覆盖CMD、添加--userns=keep-id:uid=100,gid=101参数但无效,需要解决权限问题,同时想了解是否可覆盖ENTRYPOINT以root运行、是否必须在主机创建同UID用户。
解决办法
1. 临时验证:覆盖ENTRYPOINT以root运行named
直接绕过容器默认的-u bind参数,用root启动服务,快速验证是否为用户权限导致问题:
podman run --name bind9 \ -p 11153:53/udp \ -p 11153:53/tcp \ -v /home/devops/work/dns/primary/etc:/etc/bind/:rw,Z,U \ -v /home/devops/work/dns/primary/cache:/var/cache/bind:rw,Z,U \ -v /home/devops/work/dns/primary/lib:/var/lib/bind:rw,Z,U \ -v /home/devops/work/dns/primary/log:/var/log:rw,Z,U \ --entrypoint "/usr/sbin/named" \ internetsystemsconsortium/bind9:9.20 -4 -g -c /etc/bind/named.conf
注意:生产环境不建议长期用root运行服务,仅用于验证。
2. 生产推荐:修复主机挂载目录权限
无需在主机创建新用户,通过ACL给容器内bind用户授权:
# 给所有挂载目录添加读写权限 sudo setfacl -R -m u:100:rwx /home/devops/work/dns/primary/{etc,cache,lib,log} sudo setfacl -R -m g:101:rwx /home/devops/work/dns/primary/{etc,cache,lib,log} # 设置默认ACL,确保新创建的文件也继承权限 sudo setfacl -R -m d:u:100:rwx /home/devops/work/dns/primary/{etc,cache,lib,log} sudo setfacl -R -m d:g:101:rwx /home/devops/work/dns/primary/{etc,cache,lib,log}
执行后用原命令启动容器即可(无需--userns参数)。
3. 无root容器优化:调整用户命名空间映射
如果坚持用无root容器,将容器内bind用户映射到主机devops用户(假设devops的UID/GID为1000):
- 确保devops用户有子UID/GID范围(若无则添加):
# 查看当前映射 grep devops /etc/subuid /etc/subgid # 若为空,添加映射范围 echo "devops:100000:65536" | sudo tee -a /etc/subuid /etc/subgid
- 启动容器时指定UID/GID映射:
podman run --name bind9 \ -p 11153:53/udp \ -p 11153:53/tcp \ -v /home/devops/work/dns/primary/etc:/etc/bind/:rw,Z,U \ -v /home/devops/work/dns/primary/cache:/var/cache/bind:rw,Z,U \ -v /home/devops/work/dns/primary/lib:/var/lib/bind:rw,Z,U \ -v /home/devops/work/dns/primary/log:/var/log:rw,Z,U \ --uidmap 100:1000:1 \ --gidmap 101:1000:1 \ internetsystemsconsortium/bind9:9.20 -4 -g -c /etc/bind/named.conf
参数说明:100:1000:1表示容器内UID100映射到主机UID1000,仅映射1个用户;同理GID101映射到主机GID1000。
常见疑问解答
- 为什么
--userns=keep-id:uid=100,gid=101无效?keep-id的作用是让容器内用户UID/GID与主机当前用户一致,你指定uid=100会让容器内UID变成100,但主机devops用户UID不是100,因此挂载目录仍无权限。 - 是否必须在主机创建同UID用户?
不需要,通过ACL或用户映射即可解决,创建同UID用户是可选方案但不是必须。
内容的提问来源于stack exchange,提问作者MicrocontrollersToo
相关产品推荐
相关产品推荐

