mybinder在main分支运行正常 其他分支启动报源未签名错误
问题现象
- 仓库
main分支启动mybinder时所有功能运行正常 - 切换到其他分支启动
mybinder时构建失败,抛出报错:E: The repository 'http://archive.ubuntu.com/ubuntu focal InRelease' is not signed.,多个软件源均触发同类未签名报错 - 异常分支内的
Dockerfile、apt.txt配置文件与main分支完全一致 - 新创建的分支首次启动
mybinder可正常运行,后续启动持续触发上述报错
问题根因
该报错与分支内的Dockerfile、apt.txt配置无关,核心触发逻辑是mybinder构建缓存机制与Ubuntu 20.04(focal)软件源GPG密钥轮换规则的共同作用:
main分支启动频次高,mybinder会长期留存其有效构建缓存,缓存内的apt密钥、源列表均为之前成功构建时的有效状态,因此不会触发签名错误- 非main分支的构建缓存独立存储,若分支长时间未启动、或部分构建层触发缓存失效,构建时会拉取最新的基础镜像层,但旧缓存中残留的过期源配置、缺失新版源对应的GPG签名密钥,执行
apt update时就会抛出源未签名的报错 - 新分支首次启动时会直接复用
main分支的全量有效构建缓存,因此可正常运行;后续启动时若apt安装相关层判定需要重跑,就会在半新半旧的缓存环境中执行更新操作,此时旧缓存留存的GPG密钥已过期,无法验证新拉取的InRelease文件签名,报错就会复现。
修复方案
按以下优先级操作即可解决问题:
- 强制清空目标分支的mybinder构建缓存
启动mybinder时在URL末尾追加?flush_cache=true参数,触发全量重新构建,完全不复用旧缓存,绝大多数同类问题可通过该操作直接解决。 - 在配置中显式增加密钥更新逻辑,从根源规避密钥过期问题
如果使用自定义Dockerfile,在所有apt update命令前新增如下配置:
命令中RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 871920D1991BC93C && \ apt update --allow-releaseinfo-change--allow-releaseinfo-change参数可自动适配软件源的发布信息变更,避免元数据变动导致的更新失败。
如果未自定义Dockerfile、使用repo2docker默认构建逻辑,可以在apt.txt同级目录新建apt文件夹,放入最新的有效sources.list配置替换默认过期源,同时在postBuild脚本中提前执行上述密钥更新命令。 - 排查Dockerfile中的apt相关命令,移除
apt upgrade等会跨版本升级系统核心包的操作,这类操作极易破坏系统内置的GPG密钥链,触发签名验证失败。
验证提示:修复后可先启动一次
main分支确认基础构建环境正常,再切换到目标分支加清缓存参数启动,减少无效构建次数。
内容的提问来源于stack exchange,提问作者Gianluca Baio
相关产品推荐
相关产品推荐

