記一次 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.pswp.cn/web/64596.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64596.shtml
英文地址,請注明出處:http://en.pswp.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&#…