Docker容器内切换用户时Jenkins构建卡住问题求助
在远程服务器的Docker容器中运行Jenkins,流水线使用Yocto构建容器镜像。由于Bitbake禁止root权限构建,尝试通过args '-u jenkins'指定Jenkins用户启动Yocto构建容器,但构建阶段卡住并报错:
[Pipeline] {
[Pipeline] sh (hide)
process apparently never started in /home/jenkins/workspace//durable-01a92f6b
(running Jenkins temporarily with Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true might make the problem clearer)
[Pipeline] }
当前流水线代码如下:
pipeline { agent { docker { image '<image>/yocto:dunfell' args '-u jenkins' } } stages { stage('Build Image') { steps { sh label: '', script: '''#!/bin/bash source /home/jenkins/yocto/setup-env bitbake core-image-minimal ''' } } } }
Jenkins用户在Jenkins容器和Yocto构建容器中均存在。目前临时解决方法是移除args '-u jenkins'以root启动容器,再通过sudo --user=<other-user> /bin/bash -c "<command>"执行非root命令,但希望能预先切换用户完成构建。
检查Jenkins用户的目录权限
确保Yocto构建容器中/home/jenkins目录及Jenkins工作区目录的所有者是jenkins用户,权限设置为755或更高。可以在Dockerfile中添加:RUN chown -R jenkins:jenkins /home/jenkins && chmod -R 755 /home/jenkins或者在流水线中先执行权限修复再切换用户构建:
agent { docker { image '<image>/yocto:dunfell' args '-u root' } } stages { stage('Fix Permissions') { steps { sh 'chown -R jenkins:jenkins /home/jenkins/workspace/<project>' } } stage('Build Image') { steps { sh 'su - jenkins -c "source /home/jenkins/yocto/setup-env && bitbake core-image-minimal"' } } }启用Jenkins诊断日志定位根因
按照报错提示,启动Jenkins时添加-Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true参数,查看更详细的进程启动日志,排查是否存在依赖缺失、shell路径错误或环境变量配置问题。确保容器内Jenkins用户有完整shell环境
部分容器中用户可能未设置默认bash或shell配置不完整,导致Jenkins无法启动持久化进程。可以在Dockerfile中为jenkins用户指定bash:RUN usermod -s /bin/bash jenkins或在流水线脚本中明确指定bash路径:
sh label: '', script: '''/bin/bash -c "source /home/jenkins/yocto/setup-env && bitbake core-image-minimal"'''在Dockerfile中预先配置默认构建用户
直接在Yocto构建镜像的Dockerfile中设置默认用户为jenkins,并确保该用户拥有Yocto源码目录、缓存目录的读写权限,避免在流水线中额外指定用户参数。对齐宿主机与容器的用户UID/GID
若使用卷映射工作区,需确保宿主机工作区目录的所有者UID/GID与容器内jenkins用户一致。可在容器中查看jenkins用户UID:id -u jenkins再在宿主机调整工作区权限:
chown -R <uid>:<gid> /path/to/jenkins/workspace
内容的提问来源于stack exchange,提问作者GeorgUr

