如题所述
本文会讲解在Docker容器环境下,非root用户如何编辑修改/etc/hosts文件。
以下的篇幅会描述针对这个需求,对应尝试的方案和思路,当然最终也解决了这个问题,文中会附上相应的实践,有兴趣的读者可以跟着命令操作一遍。
我们都知道,/etc/hosts文件对于普通用户一般只有 只读权限 ,既然非root用户需要编辑并修改/etc/hosts文件,那么在镜像构建过程中,将/etc/hosts文件的权限chmod为777或者是666,是否能实现这个需求呢?我们可以来验证下。
从上面的运行过程中可以看出,虽然在镜像构建的时候中已经将/etc/hosts文件的权限chmod为777了,但实际以普通用户act启动容器时,发现/etc/hosts权限并没有改变,还是644,自然而然act用户也就无法编辑修改/etc/hosts文件了,这里我们就要思考一下了,为啥在镜像构建过程中修改/etc/hosts文件权限,运行时却不生效呢?
其实这个问题,好心的网友已经有针对该问题做相应的解释了,原因就是:
无论是原生的docker命令,或者是以YAML文件方式(kubectl)进行部署,都支持在运行容器时,动态往/etc/hosts文件中设置其他的域名解析。
启动容器时在docker run命令后加上如下命令: --add-host ${host.name}:${host.ip} ,我们可以来验证下:
从上面的运行结果来看,非root用户下,通过在运行时添加 --add-host 命令确实能满足要求。
在k8s容器云环境下,以YAML文件的方式部署应用,也能满足这种需求,但对k8s有版本要求,从1.7版本之后,k8s支持了HostAliases特性实现向Pod的/etc/hosts文件中添加条目,我们可以来验证下:
从上面 的运行结果来看,使用hostAliases属性也同样能满足我们的要求,但还有一个特例,就是 如果Pod启用hostNetwork,将不能使用这个特性 ,因为kubelet只管理非hostNetwork类型的Pod的hosts文件。
这种是本文所采用的方式,因为本文的具体场景需求是:通过一个批次调度平台来启动一个Pod,Pod的YAML文件生成是由批次调度平台来决定的,经调研批次调度平台无法支持通过hostAliases属性来动态生成/etc/hosts,所以出发点还是在镜像这一块。
既然在镜像构建过程中chmod /etc/hosts文件不生效,详情可看 2.1 思路1 ,那么换另外一种思路,就是在容器启动后,动态chmod /etc/hosts权限,然后进行编辑,这种思路就转换为另外一个问题,就是 普通用户是无法执行chmod命令 ,经调研,sudo能让普通用户切换为root用户然后有权限执行指定的命令,具体实践可看以下:
从上面的运行结果来看,执行sudo命令时,系统会去/etc/supoers文件中查找是否支持当前用户进行相应的操作,由于在镜像构建过程已经将act ALL=(root) NOPASSWD: /usr/bin/chmod写入到/etc/supoers文件中了,所以普通用户执行sudo chmod 777 /etc/hosts这句命令时能切换到root用户,然后执行chmod操作,/etc/hosts文件的权限一修改,自然而然就可以进行编辑追加了。
Docker修改hosts
linux /etc/supoers文件详解
Adding entries to Pod /etc/hosts with HostAliases