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

Ubuntu 22.04基础Docker镜像构建时apt-get update偶发失败

问题根因

这个偶发故障和镜像本身无关,核心是Ubuntu 22.04搭载的apt 2.4版本默认启用了严格的沙箱校验逻辑,和CI/CD环境的Docker运行时配置存在兼容性问题:

  • apt执行软件源签名校验时会主动降权到_apt用户运行,仅允许该用户读取白名单路径下的文件,20.04及更早版本的apt无此强制沙箱限制,因此不会触发同类问题。
  • NO_PUBKEY 871920D1991BC93C是误导性假报错:不是公钥真的缺失,是_apt用户因为权限拦截根本读不到/etc/apt/trusted.gpg.d/下的密钥环文件,才会提示找不到对应公钥。
  • 偶发的原因是不同CI构建节点的Docker配置不统一:如果节点开启了rootless模式、用户命名空间映射、使用旧版fuse-overlayfs存储驱动、或者seccomp/AppArmor规则版本过旧,就会出现「表面看文件是644全局可读,但_apt用户实际被内核/安全模块拦截无法读取」的隐式权限问题;本地环境运行时配置符合apt沙箱的预期,因此构建全程正常。
修复方案

按优先级从高到低选择即可:

  • 通用必现修复:在执行apt-get update前强制重置密钥目录的属主与权限,覆盖各类隐式权限异常,修改后的Dockerfile如下:
    FROM ubuntu:22.04
    
    MAINTAINER mep-dev@zulily.com
    
    # 重置密钥环路径权限,适配各类Docker运行时的权限映射逻辑
    RUN chmod 755 /etc/apt/trusted.gpg.d && \
        chmod 644 /etc/apt/trusted.gpg.d/*.gpg && \
        chown -R root:root /etc/apt/trusted.gpg.d && \
        apt-get update
    
  • BuildKit构建场景注意:使用缓存挂载加速构建时,仅允许挂载apt包缓存路径/var/cache/apt/archives,禁止将缓存挂载到/etc/apt、/var/lib/apt路径,避免宿主机侧权限不匹配的文件覆盖容器内原生的密钥环配置。
  • 临时排障兜底:如果短期无法统一CI节点的Docker配置,可以临时关闭apt沙箱(不建议长期生产使用,会损失apt的沙箱安全防护能力):
    RUN echo 'APT::Sandbox::User "root";' > /etc/apt/apt.conf.d/99-no-sandbox && \
        apt-get update
    
  • 长期运维优化:将CI节点的Docker版本升级到20.10及以上的稳定版本,使用默认overlay2存储驱动,同步更新节点的seccomp、AppArmor规则,从运行时层面适配Ubuntu 22.04的系统调用与权限要求。

内容的提问来源于stack exchange,提问作者morningstar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:12:25