记一次 dockerfile 的循环依赖错误

文章目录

    • 1. 写在最前面
      • 1.1 具体循环依赖的例子
    • 2. 报错的位置
      • 2.1 代码快速分析
      • 2.2 代码总结
      • 2.3 关于 parser 的记录
    • 3. 碎碎念

1. 写在最前面

笔者在使用 dockerfile 多阶段构建的功能时,写出了一个「circular dependency detected on stage: xx」的错误。

解决方式:解耦互相依赖的构建阶段即可,构建 A <=> 构建 B 两个阶段是互相依赖的,改为构建 A => 构建 B

注:「多阶段构建」是 Docker 提供的一种功能,运行用户在一个 Dockerfile 中定义多个构建阶段,从而优化构镜像的大小和构建过程的效率。通过这种方式,开发者可以在不同的阶段使用不同的基础镜像和工具,最终只将所需要的文件和依赖项复制到最终的镜像中。

但是,作为一个有求知精神的软件开发工程师,笔者去翻看了一下源码的位置。(ps: 其实就是自己感兴趣 BuildKit 的源码想要学习一下,而带着问题学习的速度更快)

1.1 具体循环依赖的例子

FROM busybox AS stage0
COPY --from=stage0 f1 /sub/ 
  • FROM busybox AS stage0: 这行代码定义了一个名为 stage0 的构建阶段,并使用 busybox 作为基础镜像。

  • COPY --from=stage0 f1 /sub/: 这行代码尝试从名为 stage0 的构建阶段复制文件 f1/sub/ 目录。

在这个情况下,在同一个构建阶段中同时定义了一个新的阶段并尝试从该阶段复制文件。这会导致 Docker 无法解析这个依赖关系,因为 stage0 还没有完成构建就被引用了。

2. 报错的位置

源码仓库:GitHub - moby/buildkit: concurrent, cache-efficient, and Dockerfile-agnostic builder toolkit

具体位置:buildkit/frontend/dockerfile/dockerfile2llb/convert.go at master · moby/buildkit · GitHub

在这里插入图片描述

2.1 代码快速分析

得益于 Github 支持了 Codespaces 让笔者可以无需代码下载到本地,可以直接基于 Codespaces 对 「convert_test.go」的具体 case 直接做在线 debug ,逐行分析。

注:GitHub Codespaces 是一个基于云的开发环境,允许开发者在浏览器中创建和使用完整的开发环境。它旨在简化开发流程,特别是对于团队协作和快速启动项目。以下是 GitHub Codespaces 的一些关键特性和功能:

代码 debug 效果:

在这里插入图片描述

注:感慨一下 Codespaces 真的香!

2.2 代码总结

核心的循环依赖检测逻辑代码如下:

func validateCircularDependency(states []*dispatchState) error {var visit func(*dispatchState, []instructions.Command) []instructions.Commandif states == nil {return nil}visited := make(map[*dispatchState]struct{})path := make(map[*dispatchState]struct{})visit = func(state *dispatchState, current []instructions.Command) []instructions.Command {_, ok := visited[state]if ok {return nil}visited[state] = struct{}{}path[state] = struct{}{}for dep, c := range state.deps {next := append(current, c)if _, ok := path[dep]; ok {return next}if c := visit(dep, next); c != nil {return c}}delete(path, state)return nil}for _, state := range states {if cmds := visit(state, nil); cmds != nil {err := errors.Errorf("circular dependency detected on stage: %s", state.stageName)for _, c := range cmds {err = parser.WithLocation(err, c.Location())}return err}}return nil
}

核心分析:它使用深度优先搜索(DFS)的方式来检测循环依赖,并在发现循环时返回一个错误。

注:看来不是算法没有用,是业务逻辑的代码中使用 DFS 这种算法的场景比较少,还是得多看源码

2.3 关于 parser 的记录

对于 dockerfile 的 parser 也有点兴趣,后面要继续抽个时间深入分析一下。笔者当前负责的模块重构成一个通用的 parser 的话,代码的复用率会更高一点。希望后面有时间可以优化改进一波

3. 碎碎念

抓住 2024 的尾巴,努力学习感兴趣的知识。希望 2025 平安喜乐,万事胜意!

  • 最好的选择是,做自己的太阳

  • 幸福的秘诀是,拥有苹果时,只在意苹果,不去管橘子,更不要想橙子的事情。

  • 终于明白朝花夕拾什么意思了,你一生追求的东西其实一开始就在,只是你后知后觉而已,人无法同时拥有青春和对于青春的感受,有些东西要靠消失才能证明它的珍贵。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/64596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AAAI 2025论文分享┆一种接近全监督的无训练文档信息抽取方法:SAIL(文中附代码链接)

本推文详细介绍了一篇上海交通大学乐心怡老师课题组被人工智能顶级会议AAAI 2025录用的的最新论文《SAIL: Sample-Centric In-Context Learning for Document Information Extraction》。论文的第一作者为张金钰。该论文提出了一种无需训练的、以样本为中心的、基于上下文学习的…

小程序信息收集(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…

pat 乙级1096 大美数

若正整数 N 可以整除它的 4 个不同正因数之和&#xff0c;则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。 输入格式&#xff1a; 输入在第一行中给出正整数 K&#xff08;≤10&#xff09;&#xff0c;随后一行给出 K 个待检测的、不超过…

C#封送类

封送类&#xff08;Marshaling classes&#xff09;在.NET框架中扮演着至关重要的角色&#xff0c;尤其是在托管代码与非托管代码之间进行数据交换时。封送过程涉及到将托管环境中的对象转换为非托管环境中可以理解的形式&#xff0c;并且反之亦然。这一过程确保了两种不同类型…

计算机体系结构期末考试

1、描述计算机系统性能评估的关键指标&#xff0c;并以SPEC CPU benchmark为例&#xff0c;讨论如何使用几何平均数与加权平均数对性能进行量化。此外&#xff0c;描述Amdahl定律并分析该定律的应用场景及其对性能优化的局限性 2、请对比RISC和CISC指令集架构的设计思想及优缺点…

药片缺陷检测数据集,8625张图片,使用YOLO,PASICAL VOC XML,COCO JSON格式标注,可识别药品是否有缺陷,是否完整

药片缺陷检测数据集&#xff0c;8625张图片&#xff0c;使用YOLO&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式标注&#xff0c;可识别药品是否有缺陷&#xff0c;是否完整 有缺陷的标注信息&#xff1a; 无缺陷的标注信息 数据集下载&#xff1a; yolov11:https://d…

一文讲清楚CSS3新特性

文章目录 一文讲清楚CSS3新特性1. 新增选择器特性2. 新增的样式3. 新增布局方式 一文讲清楚CSS3新特性 1. 新增选择器特性 层次选择器(div~p)选择前面有div的p元素伪类选择器 :first-of-type 表示⼀组同级元素中其类型的第⼀个元素:last-of-type 表示⼀组同级元素中其类型的最…

【Ubuntu使用技巧】Ubuntu22.04无人值守Crontab工具实战详解

一个愿意伫立在巨人肩膀上的农民...... Crontab是Linux和类Unix操作系统下的一个任务调度工具&#xff0c;用于周期性地执行指定的任务或命令。Crontab允许用户创建和管理计划任务&#xff0c;以便在特定的时间间隔或时间点自动运行命令或脚本。这些任务可以按照分钟、小时、日…

第十六届蓝桥杯模拟赛(第一期)(C语言)

判断质因数 如果一个数p是个质数&#xff0c;同时又是整数a的约数&#xff0c;则p称为a的一个质因数。 请问2024有多少个质因数。 了解 约数&#xff0c;又称因数。整数a整除整数b&#xff0c;b为a的因数&#xff08;约数&#xff09;质数&#xff0c;又称素数。只有1和它本身两…

electron在arm64架构交叉编译遇到libnotify/notify.h文件找不到错误记录

问题描述 在按照官方文档进行arm64下electron编译时出现下面的错误&#xff0c;编译环境为ubuntun22.04.5。 问题分析 由于当前目标架构是arm64&#xff0c;所以从上图可知sysroot为build/linux/debian_bullseye_arm64-sysroot&#xff0c;进入到该目录下查看libnotify的头文…

KAFKA入门:原理架构解析

文章目录 一、认识kafka二、架构介绍2.1 工作流程2.2 Kafka可靠性保证2.3 Kafka存储 一、认识kafka Kafka到底是个啥&#xff1f;用来干嘛的&#xff1f; 官方定义如下&#xff1a; Kafka is used for building real-time data pipelines and streaming apps. It is horizont…

论文分享 | PromptFuzz:用于模糊测试驱动程序生成的提示模糊测试

大语言模型拥有的强大能力可以用来辅助多种工作&#xff0c;但如何有效的辅助仍然需要人的精巧设计。分享一篇发表于2024年CCS会议的论文PromptFuzz&#xff0c;它利用模型提示生成模糊测试驱动代码&#xff0c;并将代码片段嵌入到LLVM框架中执行模糊测试。 论文摘要 制作高质…

利用Python爬虫获取1688商品详情的探索之旅

在当今数字化时代&#xff0c;数据已成为一种宝贵的资源。对于电商行业来说&#xff0c;获取商品信息尤为重要。阿里巴巴旗下的1688平台&#xff0c;作为中国领先的B2B电子商务平台&#xff0c;提供了海量的商品信息。本文将带你了解如何使用Python爬虫技术&#xff0c;合法合规…

[算法] [leetcode-1137] 第 N 个泰波那契数

1137 第 N 个泰波那契数简单 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;4 解释&#x…

macOS上怎么制作条形码

推荐使用Barcode Flow APP&#xff0c;目前支持iOS、macOS、iPadOS 大家可以在app store里面搜索 支持几乎所有条形码的格式 gs128、code128、DataMaxitr等等。 导出和打印都可以。 还支持工具规则自动生成。

位运算与操作符应用

一.二进制与进制转化 1.概念解析 我们常常能听见2进制&#xff0c;8进制&#xff0c;16进制这些讲法。他们都是数值的不同表达形式。根据不同的进制大小有着不同的权重比例。我们生活中常用的是10进制数&#xff0c;也就是逢10进1&#xff0c;由此推理至其他进制。例如2进制就…

适配器模式概述

大体介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;其核心目的是通过提供一个适配器类来使得原本接口不兼容的类可以一起工作。它通过将一个类的接口转换成客户端所期望的接口&#xff0c;使得原本因接口不兼容而无法一起工作的类可…

计算机专业考研 408 学科学习方法

计算机专业考研 408 学科涵盖数据结构、计算机组成原理、操作系统和计算机网络四门核心课程&#xff0c;内容多且难度大。但只要掌握科学的学习方法&#xff0c;便能化繁为简&#xff0c;稳步提升。以下为大家详细介绍 408 学科的学习方法。 一、基础夯实阶段&#xff1a;全面…

C++ 设计模式:命令模式(Command Pattern)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 访问器模式 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它将请求封装成一个对象&#xff0c;从而使你可以用不同的请求对客户进行参数化&#xff0c;对请求排队或记录请求日志…

html+css+js网页设计 美食 美食4个页面带js

htmlcssjs网页设计 美食 美食4个页面带js 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…