从虚拟化到容器化部署脚本整改的采坑记

举报
Sephiroth 发表于 2020/06/16 20:44:52 2020/06/16
【摘要】 DLI是Serverless大数据计算服务,其也全面拥抱云原生,因此容器化部署也就成了必然。在虚拟化部署下我们通常会使用root用户来执行部署过程的一些脚本,使用普通用户来运行程序,即使用su - runtime_user -c 'cmd'方式来运行。但在容器化部署里,容器默认进入用户即为运行程序的普通用户,也就直接执行命令启动即可。因此我们的整改也是简单的去除了su – runtime_u...

DLI是Serverless大数据计算服务,其也全面拥抱云原生,因此容器化部署也就成了必然。

在虚拟化部署下我们通常会使用root用户来执行部署过程的一些脚本,使用普通用户来运行程序,即使用su - runtime_user -c 'cmd'方式来运行。但在容器化部署里,容器默认进入用户即为运行程序的普通用户,也就直接执行命令启动即可。因此我们的整改也是简单的去除了su – runtime_user,但出现了如下错误:

从错误中提示文件或目录不存在,可是看过去和我们的修改并没有直接关系,求助广大网友也可知和调用的脚本本身并没有关系,那究竟是什么原因导致的呢?

上图是我们整理安装部署的一个逻辑片段,整理部署逻辑包含在appctl中,主要包含部署操作的几个原子操作。对于某个组件的特殊操作会在扩展的appctl-ext中实现。本次遇到的问题就在appctl-ext中调用special_op.sh时,那我们如何去定位分析这个问题呢?

1.     从原先脚本是运行正常的可知问题并不出在被调用的脚本本身

2.     从错误日志和广大网友的回答中可知是shell脚本在调用时目录或文件被删除了,但appctl-ext中其它语句是执行正确的

其实错误的根因是很明确的,就是目录被删除了,但为什么其它语句或者使用su - runtime_user的方式调用时又没有问题呢?回到我们按照调用的逻辑图里,我们发现在执行xxx.sh里的doSomeOp时发生了目录切换到临时目录,而在appctl里又清理了该临时目录,但从执行逻辑来看还在该临时目录里,因此当调用special_op.sh时因其是类似于重新开启一个进程来执行,此时需要调用getcwd操作,但判断到目录已被删除从而异常退出,而在appctl-ext里的其他语句并没有重新起一个进程来执行操作,因此也就没有触发该bug。而对于su - runtime_user这种方式其环境上下文已经不是当前用户了,因此也不存在该问题。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。