用途:将 Podman 的 Containerfile 转换为 Discovery 目录工具所需的规范 Dockerfile。普通 Containerfile 采用 Dockerfile 语法,通常仅需改名;Podman 的 .in 预处理和多文件构建行为不能靠改名安全转换。
主要能力:
- 接受 agents/ 或 starter-kits/ 下恰好一个仓库相对路径;未提供路径时枚举变更文件中以 Containerfile 开头/结尾或包含 .Containerfile. 的候选,并包含以 .in 结尾的 Dockerfile 变体,仅在唯一候选时继续。
- 安全检查:确认源文件位于允许目录;目标 Dockerfile 已存在则停止;源名以 .in 结尾、含 #include/#define/#if 等 C 预处理器指令或依赖片段则停止;检查引用、重复 podman build -f/--file、生成式 Containerfile 及 Podman 专有构建/运行参数;遇到未知指令或非 Docker 语法前端停止;无法确定构建上下文或上下文含 .containerignore 时停止,要求先手工迁移排除规则。
- 安全迁移:所有检查通过后用 git mv 将源文件改为相邻 Dockerfile;只更新同一目录项内对旧文件名的精确字面引用;保留文件字节、换行、指令顺序、注释和解析器指令;不重写包命令或基础镜像。
- 验证:检查迁移后目录无残留 Podman 构建文件名并查看 git diff;若可用则运行 docker buildx build --check --file Dockerfile . 做语法检查;运行仓库的 POL-022 测试或 PR 验证器。
使用方式:以斜杠命令形式提供单个源路径,例如 /migrate-podman-containerfile agents/example/tools/example/Containerfile;未提供路径时按规则自动查找候选。
适用场景:PR 因 POL-022 失败、工具包含 Containerfile 需转为 Dockerfile 时。
限制:目标已存在无法覆盖;.in 文件、C 预处理器指令、片段依赖、变量或生成路径引用、多构建文件、未知指令、无法确定上下文或存在 .containerignore 时均停止,不生成尽力而为的 Dockerfile,需按迁移文档人工处理。