搜索/构建无需root权限的容器工具,并做好容器锁定和镜像下载校验

构建无需root权限的容器工具,并做好容器锁定和镜像下载校验

在开发无需root权限运行的容器工具时使用。AI会在修改容器时加锁,校验每个下载的镜像层,不把主机设置带入容器,按整个进程树停止,并在恢复备份时拒绝危险路径。

要使用这个AI规则
## 核心只用标准库构建,并识别移动端主机 核心运行时不得引入第三方依赖;执行系统查询、下载、归档处理和平台检查时,应优先使用语言原生功能,而不是启动外部命令。 ### 依赖策略 - 使用标准库检查终端功能,处理用户和组数据、二进制检查、架构检测、HTTP和归档。 - 只运行实际隔离所必需的容器运行时。 - 如果受支持的主机缺少该运行时,只能在交互式终端中,并且仅在用户同意后,才提供安装选项。 - 在适当情况下,通过替换当前进程来执行运行时,不要额外增加一层shell。 - 将包清单作为版本的唯一事实来源,并为未安装的源代码树提供已记录的回退方案。 - 将所有命令别名和控制台入口点路由到一个规范的主函数。 ### 平台检测 - 只有至少两个独立信号一致时,才将主机识别为特殊移动主机:操作系统证据、专用环境变量和可访问的平台前缀。 - 只计算一次检测结果,并将其一致地用于路径、默认环境、可用标志、绑定和运行时扩展。 - 普通主机默认遵循标准基础目录约定,不添加移动平台专用绑定。 ## 用目录名识别容器,并单独处理特殊客户机 将目录标识、元数据是否存在、旧版迁移和客户机行为作为彼此独立的决策。 ### 存储模型 - 使用经过验证的目录名作为唯一的容器标识符。 - 将组装后的文件系统存放在该目录下,并把镜像元数据保存在单独的清单中。 - 如果不存在注册表镜像,允许普通归档安装省略镜像元数据。 - 在首次需要新结构的操作中迁移旧版布局,然后重写受影响的兼容链接。 - 从一个支持平台差异的路径模块中派生运行时、缓存、容器、会话、层和清单的位置。 - 在每个入口点验证容器名,包括从镜像派生的别名和从归档中读取的名称。 ### 客户机分类 - 使用必须是文件而不只是现有路径的哨兵文件来识别特殊客户机;并发会话可能会将绑定目标实体化为目录。 - 为特殊客户机提供自己的主目录、路径、前缀和临时目录基线。 - 绝不将主机应用的私有目录或安装前缀绑定覆盖到自带这些内容的客户机上。 - 对该客户机类型禁用不兼容的链接转换和身份变更选项。 - 仅在隔离模式和最小模式之外应用可选的主机系统绑定。 - 如果共享前缀会使主机二进制文件遮蔽客户机二进制文件,则拒绝跨架构的特殊客户机。 ## 正确分派命令,用锁和临时文件保护写入 在中断、重入、进程替换、分离运行和并发缓存活动期间,命令解析和锁所有权都必须保持正确。 ### CLI流程 1. 将次级退出信号映射到常规中断路径,以便一致地清理进度显示和部分文件。 2. 对高权限执行发出非致命警告,并拒绝嵌套调用容器运行时。 3. 仅为需要运行时的命令探测运行时;让检查、进程和纯镜像命令定义更窄的门槛。 4. 在验证位置参数前拦截命令帮助,并在常规解析前拒绝未知子命令。 5. 对于启动内部程序的命令,保留字面选项分隔符之后的参数。 6. 集中强制执行必需参数,但输入模式有意决定要求的情况除外。 7. 在分派前应用全局静默模式,同时保留各命令的特定含义,并始终显示错误和警告。 ### 锁与原子性 - 对读取型会话和备份使用共享锁,对安装、移除、重命名、重置、恢复和目标写入使用排他锁。 - 按路径排序后获取多个容器锁。 - 使用输出镜像和架构作为构建锁的键,同时用独立的锁保护共享缓存索引。 - 对会在同一容器上调用另一个修改命令的命令,使排他锁可重入。 - 让会话锁在进程替换后继续存在;分离的后代继承所有权时,应放弃本进程的锁所有权而不是解锁。 - 发生锁冲突时立即失败,并在可以识别时报告锁持有者。 - 每个缓存和标记写入器都必须先创建临时文件,再进行原子替换,并在所有异常情况下清理。 ## 校验下载的镜像层,并保护镜像仓库凭据 在验证完成前,将注册表引用、认证、重定向、摘要、层和归档成员按敌对输入处理。 ### 拉取与缓存 - 优先使用完整且经过验证的缓存进行离线操作;如果只缺少部分层,仅获取缺失的层。 - 对每个下载层进行流式哈希,并在提升到正式位置前比较其摘要。 - 在把摘要转换为文件系统路径前验证其语法,防止恶意引用逃出缓存根目录。 - 拒绝归档实现无法安全解码的压缩格式。 - 实现不透明whiteout和逐项whiteout,过滤硬链接目标,并拒绝成员名路径遍历。 ### 认证与推送 - 在将Basic认证信息交给令牌服务前,要求其采用明确包含用户名和密码的形式。 - 跨主机重定向时移除授权标头。 - 将取得的令牌限定为所请求的拉取或推送操作。 - 推送前,规范化已保存的配置,并根据清单验证其摘要。 - 探测远程blob,只上传缺失的内容。 - 将不支持的上传模式和多架构索引保持在范围之外,不要用近似实现替代。 - 将授权失败显示为权限错误,同时不得暴露认证信息。 ## 如实报告客户机架构,从零构建子进程环境 架构报告和子进程环境必须描述客户机,而不是意外继承主机状态。 ### 架构 - 从已知可执行文件的二进制头中检测已安装客户机的架构。 - 通过一个映射统一规范化原生名称、注册表名称和带平台前缀的架构名称。 - 只有无法原生执行时才选择模拟器,并且只绑定其加载器需要的系统路径。 - 报告客户机架构和模拟的内核身份,不要复制主机值。 ### 子进程环境 - 从空映射构造子进程环境,并直接传给进程替换。 - 有意应用以下优先级:基线、已过滤的镜像变量、允许的主机变量、用户覆盖、身份变量,最后是终端变量。 - 在所有模式中应用镜像变量和用户变量,同时把移动主机变量限制在普通的非隔离模式。 - 在最小模式下,除非明确需要,否则省略基线路径、主机集成变量和用户身份。 - 写入登录配置文件前验证变量名,并安全引用变量值。 - 从持久配置文件中排除每会话变量、运行时内部变量、加载器变量和身份变量。 - 执行前移除加载器预加载变量,并使共享兼容目录在并发会话之间保持稳定。 ## 让容器在后台运行,并按整个进程树停止 运行、分离、终止和构建操作必须保持清单行为、锁生命周期、可移植性和进程所有权。 ### 运行与分离 - 按照容器镜像语义组合镜像入口点和命令值。 - 遵守明确的工作目录覆盖设置;否则使用镜像设置或文件系统根目录。 - 在进入任何分离分支前解析命令预览模式。 - 通过双重fork和新会话实现分离,重定向标准流,并在孙进程中登记最终运行时进程。 - 将最终进程标识符传回前台,并让分离的后代继续持有继承的容器锁。 ### 安全终止与构建 - 仅从活动会话注册表中解析终止目标。 - 终止完整的后代进程树,而不只是根节点运行时进程。 - 构建循环安全的父子映射,绝不向当前进程或系统关键进程标识符发送信号,并在遍历前验证根节点可执行文件。 - 默认使用可正常收尾的终止信号,并允许明确使用信号名或编号覆盖。 - 执行前解析构建阶段和全局参数,尽早验证目标,并通过专用处理器分派元数据、运行、复制和添加操作。 - 除非here-document提供输入,否则以隔离且非交互的方式运行构建步骤。 - 使用父状态、指令和相关额外输入作为构建缓存项的键;锁定缓存索引更新。 - 从可移植层快照中排除运行时兼容元数据,同时保留被引用文件的内容。 ## 备份和恢复容器时,拒绝不安全的归档条目 归档和终端输出会跨越信任边界,不得破坏容器状态或交互式提示。 ### 备份与恢复 - 将每个容器存放在一个归档根目录下,其中包含可选元数据和文件系统树。 - 让不可读的子树可用于备份,过滤设备和通信端点,并规范化所有权元数据。 - 如果没有明确的输出目标,拒绝向交互式终端输出二进制归档。 - 根据归档数据和标准格式检测压缩方式,包括流式输入。 - 将旧版归档布局重新映射到当前容器结构。 - 拒绝空成员、当前目录成员、父目录成员和容器名无效的成员。 - 仅当该容器的第一个有效成员已可恢复时,才获取目标锁并清空现有文件系统。 ### 终端与命令集成 - 当同级密码提示或全屏提示占用终端回显或规范模式时,抑制信息性终端写入。 - 将帮助内容保存为数据,并在已记录的宽度边界内自适应渲染。 - 在分派、解析元数据、必需参数、帮助数据和别名映射中登记每个新命令。 - 在每个新源文件中保留包许可证头和命名约定。