我们在jenkins docker stages上遇到了一些问题,它们需要以root权限运行(args root:root)。此时,我不能100%回忆起他们为什么做出这个决定,但几个月前我无法回避这个问题。
我们遇到的主要问题是root:root是jenkins不能清理自己,因为docker文件系统由root用户所有。
因此,我在我的全局groovy库中创建了一些mascarade命令
def container_init (myUserId) {
sh( returnStdout: true, script: """/usr/sbin/useradd -u ${myUserId} dummy;""").trim()
}
def command (input) {
sh( returnStdout: true, script: """su dummy -c '${input}';""").trim()
}
现在的问题是,有些docker_mask.command()没有传递失败的e2e测试或者失败的terraform部署的退出代码,有些通过了,而且非常令人兴奋,但是不一致。
我能做点什么让你顺利退出吗
2条答案
按热度按时间kkbh8khc1#
tldr
您想要/期待的退出代码被
su
命令吞噬了。长版本
基本上,您的退出代码将始终是
0
,因为您成功地切换到了dummy
用户。解决这个问题“快速而又不太干净”的方法是执行以下操作
这将弹出您所期望的退出代码。
相关事件:
警告:
我假设您正在尝试解决此处描述的一些难题:https://github.com/jenkinsci/docker-workflow-plugin/pull/57
我主动提出的0.02美元是,这种方法有很多陷阱/“步兵枪”,加上Jenkins和Docker引入的诡计也无济于事。仅仅依赖退出代码将是不可预测的,很难调试,或者几乎不可能干净地取消作业(至少在我的经验中是这样🥲),所以无论你找到什么解决方案,请务必谨慎。
lpwwtiir2#
您所面临的问题似乎与Jenkins管道中
root:root
参数的使用有关。使用root:root
作为Docker容器的用户和组可能会导致问题,例如您提到的Jenkins无法清理自身,因为Docker文件系统由root用户所有。这个问题的一个解决方案是避免使用
root:root
作为Docker容器的用户和组,而是使用Jenkins有权访问和修改的用户和组。这将允许Jenkins在自己之后进行清理,并避免退出代码的问题。另一个可能的解决方案是对Docker容器使用
jenkins
用户和组。这将允许Jenkins以必要的权限运行Docker容器,同时仍然允许它在自己之后进行清理。最后,您可以考虑在管道中使用
docker.withRegistry
方法,它允许您指定注册表和凭据来拉入和推送Docker映像。这可以帮助您在Jenkins管道中使用Docker时避免权限和退出代码问题。