欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一次dockerfile的循環(huán)依賴錯誤實戰(zhàn)記錄

 更新時間:2025年02月08日 08:33:10   作者:phantom_111  
Dockerfile 是一個文本文件,其內(nèi)包含了一條條的指令,每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當如何構(gòu)建,這篇文章主要介紹了使用Docker多階段構(gòu)建時遇到的循環(huán)依賴問題及其解決方法,,需要的朋友可以參考下

1. 寫在最前面

筆者在使用 dockerfile 多階段構(gòu)建的功能時,寫出了一個「circular dependency detected on stage: xx」的錯誤。

解決方式:解耦互相依賴的構(gòu)建階段即可,構(gòu)建 A <=> 構(gòu)建 B 兩個階段是互相依賴的,改為構(gòu)建 A => 構(gòu)建 B

注:「多階段構(gòu)建」是 Docker 提供的一種功能,運行用戶在一個 Dockerfile 中定義多個構(gòu)建階段,從而優(yōu)化構(gòu)鏡像的大小和構(gòu)建過程的效率。通過這種方式,開發(fā)者可以在不同的階段使用不同的基礎(chǔ)鏡像和工具,最終只將所需要的文件和依賴項復(fù)制到最終的鏡像中。

但是,作為一個有求知精神的軟件開發(fā)工程師,筆者去翻看了一下源碼的位置。(ps: 其實就是自己感興趣 BuildKit 的源碼想要學習一下,而帶著問題學習的速度更快)

1.1 具體循環(huán)依賴的例子

FROM busybox AS stage0
COPY --from=stage0 f1 /sub/ 
  • FROM busybox AS stage0: 這行代碼定義了一個名為 stage0 的構(gòu)建階段,并使用 busybox 作為基礎(chǔ)鏡像。

  • COPY --from=stage0 f1 /sub/: 這行代碼嘗試從名為 stage0 的構(gòu)建階段復(fù)制文件 f1 到 /sub/ 目錄。

在這個情況下,在同一個構(gòu)建階段中同時定義了一個新的階段并嘗試從該階段復(fù)制文件。這會導(dǎo)致 Docker 無法解析這個依賴關(guān)系,因為 stage0 還沒有完成構(gòu)建就被引用了。

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 是一個基于云的開發(fā)環(huán)境,允許開發(fā)者在瀏覽器中創(chuàng)建和使用完整的開發(fā)環(huán)境。它旨在簡化開發(fā)流程,特別是對于團隊協(xié)作和快速啟動項目。以下是 GitHub Codespaces 的一些關(guān)鍵特性和功能:

代碼 debug 效果:

注:感慨一下 Codespaces 真的香!

2.2 代碼總結(jié)

核心的循環(huán)依賴檢測邏輯代碼如下:

func validateCircularDependency(states []*dispatchState) error {
	var visit func(*dispatchState, []instructions.Command) []instructions.Command
	if 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
}

核心分析:它使用深度優(yōu)先搜索(DFS)的方式來檢測循環(huán)依賴,并在發(fā)現(xiàn)循環(huán)時返回一個錯誤。

注:看來不是算法沒有用,是業(yè)務(wù)邏輯的代碼中使用 DFS 這種算法的場景比較少,還是得多看源碼

2.3 關(guān)于 parser 的記錄

對于 dockerfile 的 parser 也有點興趣,后面要繼續(xù)抽個時間深入分析一下。筆者當前負責的模塊重構(gòu)成一個通用的 parser 的話,代碼的復(fù)用率會更高一點。希望后面有時間可以優(yōu)化改進一波

總結(jié)

到此這篇關(guān)于一次dockerfile的循環(huán)依賴錯誤的文章就介紹到這了,更多相關(guān)dockerfile循環(huán)依賴錯誤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Docker容器網(wǎng)絡(luò)地址的創(chuàng)建修改

    Docker容器網(wǎng)絡(luò)地址的創(chuàng)建修改

    Docker提供了一個方便的方式來配置容器的網(wǎng)絡(luò)地址,在本文中,我們將介紹如何修改Docker容器的網(wǎng)絡(luò)地址,本文主要介紹了Docker容器網(wǎng)絡(luò)地址的創(chuàng)建修改,感興趣的可以了解一下
    2024-01-01
  • Docker如何使用nginx搭建tomcat集群(圖文詳解)

    Docker如何使用nginx搭建tomcat集群(圖文詳解)

    這篇文章主要介紹了Docker使用nginx搭建tomcat集群的教程,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • 在CentOS啟動時自動加載內(nèi)核模塊overlayfs操作

    在CentOS啟動時自動加載內(nèi)核模塊overlayfs操作

    這篇文章主要介紹了在CentOS啟動時自動加載內(nèi)核模塊overlayfs操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 批量刪除docker過期停止的容器的四種方法

    批量刪除docker過期停止的容器的四種方法

    過期的容器也是占用一部分的內(nèi)存空間,這時候如果對應(yīng)一個個刪除容器id,有些麻煩,有沒有方法對應(yīng)將其批量刪除呢,本文給大家介紹了批量刪除docker過期停止的容器的四種方法,需要的朋友可以參考下
    2024-02-02
  • docker如何查看已安裝的Redis版本

    docker如何查看已安裝的Redis版本

    這篇文章主要介紹了docker如何查看已安裝的Redis版本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 使用Docker部署MySQL 5.7&8.0主從集群的方法步驟

    使用Docker部署MySQL 5.7&8.0主從集群的方法步驟

    這篇文章主要介紹了使用Docker部署MySQL 5.7&8.0主從集群的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Docker搭建prometheus(普羅米修斯)的方法步驟

    Docker搭建prometheus(普羅米修斯)的方法步驟

    phometheus:當前一套非常流行的開源監(jiān)控和報警系統(tǒng),本文主要介紹了Docker搭建prometheus(普羅米修斯)的方法步驟,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Docker overlay 網(wǎng)絡(luò)搭建的方法

    Docker overlay 網(wǎng)絡(luò)搭建的方法

    Overlay網(wǎng)絡(luò)是指通過在現(xiàn)有網(wǎng)絡(luò)上疊加一個軟件定義的邏輯網(wǎng)絡(luò),這篇文章主要介紹了Docker overlay 網(wǎng)絡(luò)搭建的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 如何使用docker極簡打包java.jar鏡像并啟動

    如何使用docker極簡打包java.jar鏡像并啟動

    這篇文章主要介紹了如何使用docker極簡打包java.jar鏡像并啟動,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • docker網(wǎng)段沖突如何解決

    docker網(wǎng)段沖突如何解決

    這篇文章主要為大家介紹了docker網(wǎng)段沖突的解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2023-05-05

最新評論