今天遇到一个比较有意思的问题,在kubernetes集群创建了一个springcloud服务,在其中一台node上面很快就启动成功,显示running了,但是在另外一台node上面,等了很久都没启动成功,查看pod日志,报错如下:
Unable to create tempDir. java.io.tmpdir is set to /tmp
意思是无法在/tmp目录下面创建临时文件。
看见这个报错,第一反应是镜像有问题,但是经过排查,发现两个node使用的同一个镜像,所以可以排除镜像的问题。
于是分别进入容器在/tmp目录创建文件测试。
node1:
node2:
果然node1上面的pod内普通用户无法在/tmp目录创建文件。
然后看了下/tmp目录权限,发现权限不一致。
node1:
node2:
现在开始怀疑是docker的问题,但查看两台node docker版本一致,其他配置也一致,docker根目录权限也完全一样。
但是为什么会出现同一个镜像,在不同服务器上运行以后,出现容器内/tmp目录不一致的情况呢?
一时间我也毫无头绪。换着关键词在各个搜索引擎搜索着,看看能否找到类似的问题。
在经过十多分钟的无用功之后,突然想起其中一台服务器的docker根目录,上周我做了数据迁移,也就是把/var/lib/docker/的数据,迁移到了其他目录,而另外一台是新安装的docker。
再次去对比了两台服务器docker根目录的权限,发现没有区别。
只能再根据这个思路,去网上找找答案,最后还是找到了我想要的答案:
在迁移 docker 根目录的时候注意使用的命令,要么使用 mv 命令直接移动,要么使用 cp 命令复制文件,但是需要注意同时复制文件权限和对应属性,不然在使用的时候可能会存在权限问题。
如果容器中,也是使用 root 用户,则不会存在该问题,但是也是需要按照正确的操作来迁移目录。
此时才想起,我当时迁移用的 cp -R 递归复制,并没有保留权限。
所以正确的应该使用cp -ar 或者 cp -rp保留原来文件的属性。
然后下线有问题的node,停止docker,删除现在的docker根目录,重新cp -ar迁移数据。
迁移完以后,启动docker重新上线node节点,再创建springcloud服务测试,已经可以正常启动。