Docker非root用戶修改/etc/hosts文件

本文會(huì)講解在Docker容器環(huán)境下,非root用戶如何編輯修改/etc/hosts文件迁酸。

1先鱼、背景和需求描述

環(huán)境:Docker
運(yùn)行用戶:非root用戶,如普通用戶1001
需求:應(yīng)用運(yùn)行在容器內(nèi)奸鬓,需要在容器內(nèi)/etc/hosts文件中添加例如hbase主機(jī)名稱的解析焙畔。

2、解決思路

以下的篇幅會(huì)描述針對(duì)這個(gè)需求串远,對(duì)應(yīng)嘗試的方案和思路宏多,當(dāng)然最終也解決了這個(gè)問(wèn)題,文中會(huì)附上相應(yīng)的實(shí)踐澡罚,有興趣的讀者可以跟著命令操作一遍伸但。

2.1 思路1(失敗)

我們都知道留搔,/etc/hosts文件對(duì)于普通用戶一般只有 只讀權(quán)限更胖,既然非root用戶需要編輯并修改/etc/hosts文件,那么在鏡像構(gòu)建過(guò)程中隔显,將/etc/hosts文件的權(quán)限chmod為777或者是666却妨,是否能實(shí)現(xiàn)這個(gè)需求呢?我們可以來(lái)驗(yàn)證下括眠。

2.1.1 Dockerfile準(zhǔn)備

[root@hbs image]# cat Dockerfile 
FROM docker.io/nginx:latest
USER root
RUN useradd act -u 1001 -g root -p 1001 && \
        chmod 777 /etc/hosts
USER act

2.1.2 鏡像構(gòu)建和運(yùn)行

[root@hbs image]# docker build -t docker.io/nginx:v1 .
[root@hbs image]# docker run -it --rm docker.io/nginx:v1 /bin/bash
act@2488c623e6fe:/$ id
uid=1001(act) gid=0(root) groups=0(root)
act@2488c623e6fe:/$ cd /etc/
act@2488c623e6fe:/etc$ ls -l | grep hosts
-rw-r--r-- 1 root root     174 May  8 13:28 hosts
act@2488c623e6fe:/etc$ echo "10.10.10.10 hbs.com" >> /etc/hosts
bash: /etc/hosts: Permission denied

從上面的運(yùn)行過(guò)程中可以看出彪标,雖然在鏡像構(gòu)建的時(shí)候中已經(jīng)將/etc/hosts文件的權(quán)限chmod為777了,但實(shí)際以普通用戶act啟動(dòng)容器時(shí)哺窄,發(fā)現(xiàn)/etc/hosts權(quán)限并沒(méi)有改變捐下,還是644,自然而然act用戶也就無(wú)法編輯修改/etc/hosts文件了萌业,這里我們就要思考一下了坷襟,為啥在鏡像構(gòu)建過(guò)程中修改/etc/hosts文件權(quán)限,運(yùn)行時(shí)卻不生效呢生年?
其實(shí)這個(gè)問(wèn)題婴程,好心的網(wǎng)友已經(jīng)有針對(duì)該問(wèn)題做相應(yīng)的解釋了,原因就是:

hosts文件并不是存放在鏡像中的抱婉,/etc/hosts档叔,/etc/resolv.conf和/etc/host這幾個(gè)文件是存放在/var/lib/docker/containers/${container-id}目錄下的,容器啟動(dòng)時(shí)是將這些文件掛載到容器內(nèi)的蒸绩,換句話說(shuō)衙四,在鏡像構(gòu)建過(guò)程中對(duì)/etc/hosts文件的修改并不會(huì)同步到容器內(nèi)的,這點(diǎn)我們可以從容器內(nèi)看出來(lái)患亿,如下传蹈。

act@2488c623e6fe:/etc$ df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          50G  5.2G   42G  11% /
tmpfs           1.9G     0  1.9G   0% /dev
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/vda1        50G  5.2G   42G  11% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           1.9G     0  1.9G   0% /proc/acpi
tmpfs           1.9G     0  1.9G   0% /proc/scsi
tmpfs           1.9G     0  1.9G   0% /sys/firmware

我們可以看到押逼,/etc/hosts文件確實(shí)是以掛載的方式mount到容器內(nèi)部的。

2.2 思路2(成功惦界,算是比較簡(jiǎn)便的方式)

無(wú)論是原生的docker命令挑格,或者是以YAML文件方式(kubectl)進(jìn)行部署,都支持在運(yùn)行容器時(shí)沾歪,動(dòng)態(tài)往/etc/hosts文件中設(shè)置其他的域名解析漂彤。

2.2.1 docker原生命令

啟動(dòng)容器時(shí)在docker run命令后加上如下命令:--add-host ${host.name}:${host.ip},我們可以來(lái)驗(yàn)證下:

[root@hbs image]# docker run --add-host hbs.com:10.10.10.10 -d docker.io/nginx:v1
e8d77f865c87b133ee60eaa41666422426fb96fe4e807e2b8bec81941fb5174b
[root@hbs image]# cat /var/lib/docker/containers/e8d77f865c87b133ee60eaa41666422426fb96fe4e807e2b8bec81941fb5174b/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.10.10.10     hbs.com
172.17.0.3      e8d77f865c87

從上面的運(yùn)行結(jié)果來(lái)看灾搏,非root用戶下挫望,通過(guò)在運(yùn)行時(shí)添加--add-host命令確實(shí)能滿足要求。

2.2.2 YAML文件方式部署

在k8s容器云環(huán)境下确镊,以YAML文件的方式部署應(yīng)用士骤,也能滿足這種需求,但對(duì)k8s有版本要求蕾域,從1.7版本之后拷肌,k8s支持了HostAliases特性實(shí)現(xiàn)向Pod的/etc/hosts文件中添加條目,我們可以來(lái)驗(yàn)證下:

[root@hbs ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.1", GitCommit:"b7394102d6ef778017f2ca4046abbaa23b88c290", GitTreeState:"clean", BuildDate:"2019-04-08T17:11:31Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.1", GitCommit:"b7394102d6ef778017f2ca4046abbaa23b88c290", GitTreeState:"clean", BuildDate:"2019-04-08T17:02:58Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}

[root@hbs appdata]# kubectl get deployment nonexistent-goose-hbs-helm -o yaml -n helm-test > helm-test.yaml
[root@hbs appdata]# vim helm-test.yaml

    spec:
      hostAliases:
      - ip: "1.2.3.4"
        hostnames:
        - "hbs.com"
      containers:
      - image: docker.io/nginx:latest

[root@hbs appdata]# kubectl apply -f helm-test.yaml -n helm-test
[root@hbs appdata]# kubectl exec nonexistent-goose-hbs-helm-7d846fffb5-zdsln cat /etc/hosts -n helm-test
# Kubernetes-managed hosts file.
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
10.244.0.12     nonexistent-goose-hbs-helm-7d846fffb5-zdsln

# Entries added by HostAliases.
1.2.3.4 hbs.com

從上面 的運(yùn)行結(jié)果來(lái)看旨巷,使用hostAliases屬性也同樣能滿足我們的要求巨缘,但還有一個(gè)特例,就是如果Pod啟用hostNetwork采呐,將不能使用這個(gè)特性若锁,因?yàn)閗ubelet只管理非hostNetwork類型的Pod的hosts文件。

2.3 思路3(成功斧吐,sudo修改鏡像)

這種是本文所采用的方式又固,因?yàn)楸疚牡木唧w場(chǎng)景需求是:通過(guò)一個(gè)批次調(diào)度平臺(tái)來(lái)啟動(dòng)一個(gè)Pod,Pod的YAML文件生成是由批次調(diào)度平臺(tái)來(lái)決定的煤率,經(jīng)調(diào)研批次調(diào)度平臺(tái)無(wú)法支持通過(guò)hostAliases屬性來(lái)動(dòng)態(tài)生成/etc/hosts仰冠,所以出發(fā)點(diǎn)還是在鏡像這一塊。
既然在鏡像構(gòu)建過(guò)程中chmod /etc/hosts文件不生效蝶糯,詳情可看2.1 思路1洋只,那么換另外一種思路,就是在容器啟動(dòng)后昼捍,動(dòng)態(tài)chmod /etc/hosts權(quán)限识虚,然后進(jìn)行編輯,這種思路就轉(zhuǎn)換為另外一個(gè)問(wèn)題妒茬,就是普通用戶是無(wú)法執(zhí)行chmod命令担锤,經(jīng)調(diào)研,sudo能讓普通用戶切換為root用戶然后有權(quán)限執(zhí)行指定的命令乍钻,具體實(shí)踐可看以下:

[root@hbs image]# cat Dockerfile
FROM docker.io/dustise/yum.centos7:latest
USER root
RUN useradd act -u 1001 -g root && \
        yum install -y sudo && \
        echo "act ALL=(root) NOPASSWD: /usr/bin/chmod" >>  /etc/supoers
USER act

其中主要關(guān)注**echo "act ALL=(root) NOPASSWD: /usr/bin/chmod" >>  /etc/supoers**這一句命令肛循,意思是普通用戶act在執(zhí)行sudo chmod這句命令時(shí)能短暫切換為root用戶并且執(zhí)行chmod操作蛛株,NOPASSWD命令是切換用戶無(wú)需輸入密碼。

[root@hbs image]# docker build -t docker.io/yum.centos7:v3 . --no-cache
[root@hbs image]# docker run -it --rm docker.io/yum.centos7:v3 /bin/bash
[act@9c9f5c15abc8 /]$ id
uid=1001(act) gid=0(root) groups=0(root)
[act@9c9f5c15abc8 /]$ sudo chmod 777 /etc/hosts
[act@9c9f5c15abc8 /]$ echo "11.22.33.44 hbs.com" >> /etc/hosts
[act@9c9f5c15abc8 /]$ cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3      9c9f5c15abc8
11.22.33.44 hbs.com

從上面的運(yùn)行結(jié)果來(lái)看育拨,執(zhí)行sudo命令時(shí),系統(tǒng)會(huì)去/etc/supoers文件中查找是否支持當(dāng)前用戶進(jìn)行相應(yīng)的操作欢摄,由于在鏡像構(gòu)建過(guò)程已經(jīng)將act ALL=(root) NOPASSWD: /usr/bin/chmod寫入到/etc/supoers文件中了熬丧,所以普通用戶執(zhí)行sudo chmod 777 /etc/hosts這句命令時(shí)能切換到root用戶,然后執(zhí)行chmod操作怀挠,/etc/hosts文件的權(quán)限一修改析蝴,自然而然就可以進(jìn)行編輯追加了。

3绿淋、參考資料

Docker修改hosts
linux /etc/supoers文件詳解
Adding entries to Pod /etc/hosts with HostAliases

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闷畸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吞滞,更是在濱河造成了極大的恐慌佑菩,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裁赠,死亡現(xiàn)場(chǎng)離奇詭異殿漠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)佩捞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門绞幌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人一忱,你說(shuō)我怎么就攤上這事莲蜘。” “怎么了帘营?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵票渠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我仪吧,道長(zhǎng)庄新,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任薯鼠,我火速辦了婚禮择诈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘出皇。我一直安慰自己羞芍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布郊艘。 她就那樣靜靜地躺著荷科,像睡著了一般唯咬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畏浆,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天胆胰,我揣著相機(jī)與錄音,去河邊找鬼刻获。 笑死蜀涨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝎毡。 我是一名探鬼主播厚柳,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沐兵!你這毒婦竟也來(lái)了别垮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扎谎,失蹤者是張志新(化名)和其女友劉穎碳想,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毁靶,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡移袍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了老充。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葡盗。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖啡浊,靈堂內(nèi)的尸體忽然破棺而出觅够,到底是詐尸還是另有隱情,我是刑警寧澤巷嚣,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布喘先,位于F島的核電站,受9級(jí)特大地震影響廷粒,放射性物質(zhì)發(fā)生泄漏窘拯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一坝茎、第九天 我趴在偏房一處隱蔽的房頂上張望涤姊。 院中可真熱鬧,春花似錦嗤放、人聲如沸思喊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)恨课。三九已至舆乔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剂公,已是汗流浹背希俩。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纲辽,地道東北人斜纪。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像文兑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腺劣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容