今天遇到一個比較有意思的問題,在kubernetes集群創(chuàng)建了一個springcloud服務,在其中一臺node上面很快就啟動成功,顯示running了,但是在另外一臺node上面,等了很久都沒啟動成功,查看pod日志,報錯如下:
Unable to create tempDir. java.io.tmpdir is set to /tmp
意思是無法在/tmp目錄下面創(chuàng)建臨時文件。
看見這個報錯,第一反應是鏡像有問題,但是經(jīng)過排查,發(fā)現(xiàn)兩個node使用的同一個鏡像,所以可以排除鏡像的問題。
于是分別進入容器在/tmp目錄創(chuàng)建文件測試。
node1:

node2:

果然node1上面的pod內普通用戶無法在/tmp目錄創(chuàng)建文件。
然后看了下/tmp目錄權限,發(fā)現(xiàn)權限不一致。
node1:

node2:

現(xiàn)在開始懷疑是docker的問題,但查看兩臺node docker版本一致,其他配置也一致,docker根目錄權限也完全一樣。
但是為什么會出現(xiàn)同一個鏡像,在不同服務器上運行以后,出現(xiàn)容器內/tmp目錄不一致的情況呢?
一時間我也毫無頭緒。換著關鍵詞在各個搜索引擎搜索著,看看能否找到類似的問題。
在經(jīng)過十多分鐘的無用功之后,突然想起其中一臺服務器的docker根目錄,上周我做了數(shù)據(jù)遷移,也就是把/var/lib/docker/的數(shù)據(jù),遷移到了其他目錄,而另外一臺是新安裝的docker。
再次去對比了兩臺服務器docker根目錄的權限,發(fā)現(xiàn)沒有區(qū)別。
只能再根據(jù)這個思路,去網(wǎng)上找找答案,最后還是找到了我想要的答案:
在遷移 docker 根目錄的時候注意使用的命令,要么使用 mv 命令直接移動,要么使用 cp 命令復制文件,但是需要注意同時復制文件權限和對應屬性,不然在使用的時候可能會存在權限問題。
如果容器中,也是使用 root 用戶,則不會存在該問題,但是也是需要按照正確的操作來遷移目錄。
此時才想起,我當時遷移用的 cp -R 遞歸復制,并沒有保留權限。
所以正確的應該使用cp -ar 或者 cp -rp保留原來文件的屬性。
然后下線有問題的node,停止docker,刪除現(xiàn)在的docker根目錄,重新cp -ar遷移數(shù)據(jù)。
遷移完以后,啟動docker重新上線node節(jié)點,再創(chuàng)建springcloud服務測試,已經(jīng)可以正常啟動。


