You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:55:17