Jenkins中从运行的Docker镜像访问工作区文件的问询
问题解答
是的,dockerExecute步骤默认会将Jenkins代理的工作区挂载到容器内部的对应路径,所以容器里的脚本完全可以访问到之前克隆的GitHub仓库本地副本。
原因说明
Jenkins的Docker相关流水线步骤(包括dockerExecute),默认行为是把当前Jenkins节点的工作目录(也就是你执行git步骤克隆仓库的目录)挂载为容器内的工作目录。这意味着容器内的文件系统和代理节点的工作区是共享的,之前克隆的仓库文件在容器里完全可见。
你的代码需要调整的几个点
- Git URL的变量解析问题:原代码里git步骤的URL用了单引号,Groovy中单引号不会解析变量,要改成双引号才能正确替换
${GH_HOSTNAME}等变量:git branch: 'main', credentialsId:'GITHUB_TOKEN_CRED_ID', url: "https://${GH_HOSTNAME}/${GH_ORG_NAME}/${GH_REPO_NAME}.git" - 仓库路径的正确引用:脚本里的路径可以直接用Jenkins内置的
WORKSPACE环境变量(这个变量在容器内也会被传递),或者用相对路径(因为克隆的仓库就在工作区根目录):sh ''' script -d "${WORKSPACE}" ''' - 转义引号的问题:原代码里的
"是HTML转义的双引号,直接换成正常双引号即可,因为sh块用了三重单引号,内部可以直接使用双引号。
修改后的完整流水线示例
node() { stage('Clone GITHUB repo') { git branch: 'main', credentialsId:'GITHUB_TOKEN_CRED_ID', url: "https://${GH_HOSTNAME}/${GH_ORG_NAME}/${GH_REPO_NAME}.git" } stage('launch script') { dockerExecute(script: this, dockerImage: 'Docker_image_repository'){ withCredentials([usernamePassword(credentialsId: GITHUB_TOKEN_CRED_ID, usernameVariable: 'GITHUB_USER', passwordVariable: 'GITHUB_AUTH_TOKEN')]) { sh ''' script -d "${WORKSPACE}" ''' } } } }
额外注意事项
- 如果你的
dockerExecute步骤手动配置了volumes参数覆盖了默认挂载,那需要确保把Jenkins工作区挂载到容器内,否则会无法访问仓库。 - 容器内的用户权限要和Jenkins代理上的文件权限匹配,避免出现"权限不足"无法读取仓库文件的问题。
内容的提问来源于stack exchange,提问作者Michal Škultý
相关产品推荐
相关产品推荐

