如果我启动容器--uts=private
,我仍然无法更改主机名。但听起来这正是这应该的目的?
有什么--uts=private
作用?
$ podman run -ti --uts=private alpine
/ # hostname foo.bar.baz
hostname: sethostname: Operation not permitted
该错误与 CentOS 略有不同,
$ podman run -ti --uts=private centos:7
[root@e5fd4d09f5c3 /]# hostname foo.bar.baz
hostname: you must be root to change the host name
如果我的容器有新的私有命名空间,为什么我不能更改主机名?
答案1
我们根据命名空间功能阻止您。默认情况下,容器不会获取 CAP_SYS_ADMIN。
$ podman run -ti --uts=private --hostname foobar centos
# hostname
foobar
$ podman run -ti --cap-add SYS_ADMIN --uts=private centos
[root@a4f36e700ad7 /]# hostname foobar
[root@a4f36e700ad7 /]# hostname
foobar
[root@a4f36e700ad7 /]# exit
答案2
来自 irc.freenode.net/#podman,
< nalind> EvanCarroll:除非您使用 运行容器
--cap-add sys_admin
,否则默认的 seccomp 过滤器(来自/usr/share/containers/seccomp.json
)将不允许sethostname
系统调用,并且内核将不允许该调用
我想了解更多,但这是一个开始。所以我会将其标记为社区维基,并在有真正答案时将其删除。
即,
- 如果无法设置主机名,私有 uts 命名空间的用途是什么?
- 为什么设置主机名的功能被锁定了
cap_sys_admin
?