同一个docker镜像在不同的服务器运行/tmp目录权限不一致解决办法

2021年7月5日14:47:48 发表评论 3,862 ℃

今天遇到一个比较有意思的问题,在kubernetes集群创建了一个springcloud服务,在其中一台node上面很快就启动成功,显示running了,但是在另外一台node上面,等了很久都没启动成功,查看pod日志,报错如下:

Unable to create tempDir. java.io.tmpdir is set to /tmp

意思是无法在/tmp目录下面创建临时文件。

看见这个报错,第一反应是镜像有问题,但是经过排查,发现两个node使用的同一个镜像,所以可以排除镜像的问题。

于是分别进入容器在/tmp目录创建文件测试。

node1:

同一个docker镜像在不同的服务器运行/tmp目录权限不一致解决办法

node2:

同一个docker镜像在不同的服务器运行/tmp目录权限不一致解决办法

果然node1上面的pod内普通用户无法在/tmp目录创建文件。

然后看了下/tmp目录权限,发现权限不一致。

node1:

同一个docker镜像在不同的服务器运行/tmp目录权限不一致解决办法

node2:

同一个docker镜像在不同的服务器运行/tmp目录权限不一致解决办法

现在开始怀疑是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服务测试,已经可以正常启动。

【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: