最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1. 寫(xiě)在最前面

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

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

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

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

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

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

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

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

2. 報(bào)錯(cuò)的位置

源碼倉(cāng)庫(kù):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 讓筆者可以無(wú)需代碼下載到本地,可以直接基于 Codespaces 對(duì) 「convert_test.go」的具體 case 直接做在線 debug ,逐行分析。

注:GitHub Codespaces 是一個(gè)基于云的開(kāi)發(fā)環(huán)境,允許開(kāi)發(fā)者在瀏覽器中創(chuàng)建和使用完整的開(kāi)發(fā)環(huán)境。它旨在簡(jiǎn)化開(kāi)發(fā)流程,特別是對(duì)于團(tuán)隊(duì)協(xié)作和快速啟動(dòng)項(xiàng)目。以下是 GitHub Codespaces 的一些關(guān)鍵特性和功能:

代碼 debug 效果:

注:感慨一下 Codespaces 真的香!

2.2 代碼總結(jié)

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

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)的方式來(lái)檢測(cè)循環(huán)依賴,并在發(fā)現(xiàn)循環(huán)時(shí)返回一個(gè)錯(cuò)誤。

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

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

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

總結(jié)

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

相關(guān)文章

  • Docker無(wú)法登錄與推送問(wèn)題解決的詳細(xì)教程

    Docker無(wú)法登錄與推送問(wèn)題解決的詳細(xì)教程

    這篇文章主要介紹了如何使用阿里云容器鏡像服務(wù)來(lái)解決國(guó)內(nèi)訪問(wèn)Docker?Hub速度慢的問(wèn)題,并詳細(xì)描述了如何設(shè)置阿里云鏡像服務(wù)、配置Docker、操作鏡像(包括pull和push)以及測(cè)試?yán)$R像的過(guò)程,需要的朋友可以參考下
    2025-02-02
  • 給docker配置指定ip的超詳細(xì)圖解

    給docker配置指定ip的超詳細(xì)圖解

    這篇文章主要給大家介紹了關(guān)于給docker配置指定ip的超詳細(xì)圖解教程,Docker容器的IP地址由Docker守護(hù)進(jìn)程動(dòng)態(tài)分配,默認(rèn)情況下,它使用的是宿主機(jī)的IP地址,但是在某些情況下,您可能需要為Docker容器指定靜態(tài)IP地址,需要的朋友可以參考下
    2023-09-09
  • Prometheus 整合 AlertManager的教程詳解

    Prometheus 整合 AlertManager的教程詳解

    Alertmanager 主要用于接收 Prometheus 發(fā)送的告警信息,它很容易做到告警信息的去重,降噪,分組,策略路由,是一款前衛(wèi)的告警通知系統(tǒng)。這篇文章主要介紹了Prometheus 整合 AlertManager的教程 ,需要的朋友可以參考下
    2019-07-07
  • docker實(shí)現(xiàn)mysql主從復(fù)制的示例代碼

    docker實(shí)現(xiàn)mysql主從復(fù)制的示例代碼

    Docker它不香嗎?即省去了安裝Mysql所需要的步驟,有多個(gè)容器之間相互資源獨(dú)立,IP互不沖突,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-08-08
  • 國(guó)內(nèi)服務(wù)器配置Docker國(guó)內(nèi)源(極限加速)

    國(guó)內(nèi)服務(wù)器配置Docker國(guó)內(nèi)源(極限加速)

    本文主要介紹了國(guó)內(nèi)服務(wù)器配置Docker國(guó)內(nèi)源,用戶可以在CentOS服務(wù)器上成功安裝并使用國(guó)內(nèi)鏡像加速器來(lái)提升Docker的使用,感興趣的可以了解一下
    2025-02-02
  • 在Docker容器中不需要運(yùn)行sshd的原因淺析

    在Docker容器中不需要運(yùn)行sshd的原因淺析

    在一個(gè)容器中運(yùn)行SSH服務(wù)器,這真的是一個(gè)錯(cuò)誤(大寫(xiě)字母W)嗎?老實(shí)說(shuō),沒(méi)那么嚴(yán)重。當(dāng)你不去訪問(wèn)Docker主機(jī)的時(shí)候,這樣做甚至是極其方便的,但是這仍然需要在容器中取得一個(gè)shell
    2016-11-11
  • 將spring boot應(yīng)用打入docker中運(yùn)行的實(shí)現(xiàn)方法

    將spring boot應(yīng)用打入docker中運(yùn)行的實(shí)現(xiàn)方法

    這篇文章主要介紹了將spring boot應(yīng)用打入docker中運(yùn)行的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • docker start啟動(dòng)容器后仍然exit狀態(tài)的解決

    docker start啟動(dòng)容器后仍然exit狀態(tài)的解決

    這篇文章主要介紹了docker start啟動(dòng)容器后仍然exit狀態(tài)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Docker 容器文件系統(tǒng)詳細(xì)介紹(圖文)

    Docker 容器文件系統(tǒng)詳細(xì)介紹(圖文)

    這篇文章主要介紹了Docker 容器文件系統(tǒng)詳細(xì)介紹(圖文)的相關(guān)資料,這里對(duì)Docker 容器文件系統(tǒng)進(jìn)行了具體的分析詳解,需要的朋友可以參考下
    2016-12-12
  • Docker Compose從安裝到使用詳細(xì)過(guò)程

    Docker Compose從安裝到使用詳細(xì)過(guò)程

    Docker Compose是Docker官方提供的一個(gè)工具,用于定義和運(yùn)行多容器 Docker應(yīng)用程序,本文給大家介紹Docker Compose從安裝到使用詳細(xì)過(guò)程,感興趣的朋友跟隨小編一起看看吧
    2025-09-09

最新評(píng)論

新化县| 宝清县| 辛集市| 宁都县| 滨海县| 福贡县| 双鸭山市| 平泉县| 渝北区| 读书| 桂东县| 通辽市| 齐齐哈尔市| 石林| 抚远县| 大方县| 新绛县| 清河县| 辉县市| 合江县| 江口县| 庄浪县| 年辖:市辖区| 郸城县| 蒙阴县| 开平市| 神农架林区| 常宁市| 肥西县| 本溪| 博罗县| 汕尾市| 公主岭市| 禄劝| 青冈县| 南投市| 陆丰市| 梅河口市| 台中县| 同江市| 雷州市|