Docker非root用户修改etchosts文件

Docker非root用户修改etchosts文件,第1张

本文会讲解在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

解决方案如下:

1、在Docker运行时启动的脚本中把原来的/etc/脊闹升hosts复制一份到/etc/hosts.temp中,

2、弯仿既然原来的文件不能修改,则修改复制后的文件,

3、然后可以使用cat命樱老令cat/etc/hosts.temp

>

/etc/hosts覆盖。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12296267.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存