Docker环境下Jenkins备份恢复失败:config.xml读取报错
Docker中Jenkins备份恢复报错处理
操作过程
尝试备份Docker容器内的Jenkins,通过备份插件完成备份后,用以下命令将备份文件复制到宿主机:
docker cp 2620d31f3b67:/Users/sidharth/jenkins_vol.zip .
解压备份文件后,执行挂载命令启动Jenkins:
docker run -v ./jenkins_vol:/var/jenkins_home -p 8080:8080 jenkins/jenkins:lts
报错信息
启动后出现如下错误:
sidharth@Sidharths-MacBook-Air ~ % docker run -v /Users/sidharth/jenkins_vol:/var/jenkins_home -p 8080:8080 jenkins/jenkins:lts 运行路径: /usr/share/jenkins/jenkins.war webroot: EnvVars.masterEnvVars.get("JENKINS_HOME") 2023-02-25 08:07:32.364+0000 [id=1] INFO org.eclipse.jetty.util.log.Log#initialized: 日志初始化完成 @325ms,使用org.eclipse.jetty.util.log.JavaUtilLog 2023-02-25 08:07:32.402+0000 [id=1] INFO winstone.Logger#logInternal: 开始从war文件提取内容 2023-02-25 08:07:57.594+0000 [id=1] WARNING o.e.j.s.handler.ContextHandler#setContextPath: 空ContextPath 2023-02-25 08:07:57.637+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: jetty-9.4.45.v20220203; 构建时间: 2022-02-03T09:14:34.105Z; git: 4a0c91c0be53805e3fcffdcdcc9587d5301863db; jvm 11.0.16+8 2023-02-25 08:07:58.367+0000 [id=1] INFO o.e.j.w.StandardDescriptorProcessor#visitServlet: / 路径无JSP支持,未找到org.eclipse.jetty.jsp.JettyJspServlet 2023-02-25 08:07:58.463+0000 [id=1] INFO o.e.j.s.s.DefaultSessionIdManager#doStart: DefaultSessionIdManager workerName=node0 2023-02-25 08:07:58.463+0000 [id=1] INFO o.e.j.s.s.DefaultSessionIdManager#doStart: 未设置SessionScavenger,使用默认配置 2023-02-25 08:07:58.464+0000 [id=1] INFO o.e.j.server.session.HouseKeeper#startScavenging: node0 每660000ms清理一次会话 2023-02-25 08:07:59.989+0000 [id=1] INFO hudson.WebAppMain#contextInitialized: Jenkins主目录: /var/jenkins_home,来自: EnvVars.masterEnvVars.get("JENKINS_HOME") 2023-02-25 08:08:00.453+0000 [id=1] INFO o.e.j.s.handler.ContextHandler#doStart: 已启动 w.@73a19967{Jenkins v2.346.3,/,file:///var/jenkins_home/war/,AVAILABLE}{/var/jenkins_home/war} 2023-02-25 08:08:00.469+0000 [id=1] INFO o.e.j.server.AbstractConnector#doStart: 已启动 ServerConnector@39a8312f{HTTP/1.1, (http/1.1)}{0.0.0.0:8080} 2023-02-25 08:08:00.469+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: 启动完成 @28440ms 2023-02-25 08:08:00.470+0000 [id=24] INFO winstone.Logger#logInternal: Winstone Servlet引擎运行中: controlPort=disabled 2023-02-25 08:08:01.436+0000 [id=30] INFO jenkins.InitReactorRunner$1#onAttained: 初始化已启动 2023-02-25 08:08:01.555+0000 [id=32] INFO jenkins.InitReactorRunner$1#onAttained: 已列出所有插件 2023-02-25 08:08:04.001+0000 [id=35] INFO jenkins.InitReactorRunner$1#onAttained: 已准备好所有插件 2023-02-25 08:08:04.014+0000 [id=30] INFO jenkins.InitReactorRunner$1#onAttained: 已启动所有插件 2023-02-25 08:08:04.041+0000 [id=31] INFO jenkins.InitReactorRunner$1#onAttained: 已扩展所有扩展项 2023-02-25 08:08:04.223+0000 [id=34] SEVERE jenkins.InitReactorRunner$1#onTaskFailed: 加载全局配置失败 com.thoughtworks.xstream.mapper.CannotResolveClassException: hudson.security.GlobalMatrixAuthorizationStrategy at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:81) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125) at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125) at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125) at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125) at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125) at com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:71) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125) at hudson.util.XStream2$CompatibilityMapper.realClass(XStream2.java:411) at hudson.util.xstream.MapperDelegate.realClass(MapperDelegate.java:46) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125) at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:47) at hudson.util.RobustReflectionConverter.determineType(RobustReflectionConverter.java:521) at hudson.util.RobustReflectionConverter.doUnmarshal(RobustReflectionConverter.java:346) 导致: jenkins.util.xstream.CriticalXStreamException: ---- 调试信息 ---- cause-exception : com.thoughtworks.xstream.mapper.CannotResolveClassException cause-message : hudson.security.GlobalMatrixAuthorizationStrategy class : hudson.model.Hudson required-type : hudson.model.Hudson converter-type : hudson.util.RobustReflectionConverter path : /hudson/authorizationStrategy line number : 10 version : 不可用 ------------------------------- at hudson.util.RobustReflectionConverter.doUnmarshal(RobustReflectionConverter.java:381) at hudson.util.RobustReflectionConverter.unmarshal(RobustReflectionConverter.java:289) at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:74) at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:72) at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:68) at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:52) at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:136) at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32) at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1421) at hudson.util.XStream2.unmarshal(XStream2.java:189) at hudson.util.XStream2.unmarshal(XStream2.java:160) at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1399) at hudson.XmlFile.unmarshal(XmlFile.java:196) 导致: java.io.IOException: 无法读取 /var/jenkins_home/config.xml
错误原因
核心错误是hudson.security.GlobalMatrixAuthorizationStrategy类无法被解析,说明原Jenkins实例安装了矩阵授权策略插件(Matrix Authorization Strategy Plugin),但新启动的Jenkins LTS容器中缺少该插件,导致Jenkins读取全局配置文件config.xml时失败。
解决方法
方法一:先安装缺失插件再挂载备份目录
- 临时启动一个干净的Jenkins容器,不挂载备份目录:
docker run -p 8080:8080 jenkins/jenkins:lts
- 完成Jenkins初始化流程,进入插件管理页面,搜索并安装Matrix Authorization Strategy Plugin
- 停止并删除这个临时容器:
docker stop <临时容器ID> docker rm <临时容器ID>
- 重新挂载备份目录启动Jenkins:
docker run -v /Users/sidharth/jenkins_vol:/var/jenkins_home -p 8080:8080 jenkins/jenkins:lts
方法二:修改配置文件临时替换授权策略
- 打开备份目录下的
config.xml文件 - 找到
<authorizationStrategy>节点,将原内容替换为默认的授权策略配置:
<authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy"> <denyAnonymousReadAccess>true</denyAnonymousReadAccess> </authorizationStrategy>
- 保存文件后重新启动Jenkins容器,启动成功后进入插件管理页面安装Matrix Authorization Strategy Plugin,之后再恢复原来的授权配置
注意事项
- 备份恢复时尽量保持新旧Jenkins版本一致,避免插件兼容性问题
- 使用备份插件时,确保备份包包含所有依赖插件的数据,或提前确认并安装好所需插件
内容的提问来源于stack exchange,提问作者sidharth vijayakumar
相关产品推荐
相关产品推荐

