今天遇到一個(gè)比較有意思的問(wèn)題,在kubernetes集群創(chuàng)建了一個(gè)springcloud服務(wù),在其中一臺(tái)node上面很快就啟動(dòng)成功,顯示running了,但是在另外一臺(tái)node上面,等了很久都沒(méi)啟動(dòng)成功,查看pod日志,報(bào)錯(cuò)如下:
Unable to create tempDir. java.io.tmpdir is set to /tmp
意思是無(wú)法在/tmp目錄下面創(chuàng)建臨時(shí)文件。
看見(jiàn)這個(gè)報(bào)錯(cuò),第一反應(yīng)是鏡像有問(wèn)題,但是經(jīng)過(guò)排查,發(fā)現(xiàn)兩個(gè)node使用的同一個(gè)鏡像,所以可以排除鏡像的問(wèn)題。
于是分別進(jìn)入容器在/tmp目錄創(chuàng)建文件測(cè)試。
node1:
node2:
果然node1上面的pod內(nèi)普通用戶無(wú)法在/tmp目錄創(chuàng)建文件。
然后看了下/tmp目錄權(quán)限,發(fā)現(xiàn)權(quán)限不一致。
node1:
node2:
現(xiàn)在開(kāi)始懷疑是docker的問(wèn)題,但查看兩臺(tái)node docker版本一致,其他配置也一致,docker根目錄權(quán)限也完全一樣。
但是為什么會(huì)出現(xiàn)同一個(gè)鏡像,在不同服務(wù)器上運(yùn)行以后,出現(xiàn)容器內(nèi)/tmp目錄不一致的情況呢?
一時(shí)間我也毫無(wú)頭緒。換著關(guān)鍵詞在各個(gè)搜索引擎搜索著,看看能否找到類似的問(wèn)題。
在經(jīng)過(guò)十多分鐘的無(wú)用功之后,突然想起其中一臺(tái)服務(wù)器的docker根目錄,上周我做了數(shù)據(jù)遷移,也就是把/var/lib/docker/的數(shù)據(jù),遷移到了其他目錄,而另外一臺(tái)是新安裝的docker。
再次去對(duì)比了兩臺(tái)服務(wù)器docker根目錄的權(quán)限,發(fā)現(xiàn)沒(méi)有區(qū)別。
只能再根據(jù)這個(gè)思路,去網(wǎng)上找找答案,最后還是找到了我想要的答案:
在遷移 docker 根目錄的時(shí)候注意使用的命令,要么使用 mv 命令直接移動(dòng),要么使用 cp 命令復(fù)制文件,但是需要注意同時(shí)復(fù)制文件權(quán)限和對(duì)應(yīng)屬性,不然在使用的時(shí)候可能會(huì)存在權(quán)限問(wèn)題。
如果容器中,也是使用 root 用戶,則不會(huì)存在該問(wèn)題,但是也是需要按照正確的操作來(lái)遷移目錄。
此時(shí)才想起,我當(dāng)時(shí)遷移用的 cp -R 遞歸復(fù)制,并沒(méi)有保留權(quán)限。
所以正確的應(yīng)該使用cp -ar 或者 cp -rp保留原來(lái)文件的屬性。
然后下線有問(wèn)題的node,停止docker,刪除現(xiàn)在的docker根目錄,重新cp -ar遷移數(shù)據(jù)。
遷移完以后,啟動(dòng)docker重新上線node節(jié)點(diǎn),再創(chuàng)建springcloud服務(wù)測(cè)試,已經(jīng)可以正常啟動(dòng)。