從零自制docker-14-【實現 mydocker commit 打包容器成鏡像】

文章目錄

  • 目標
  • 注意
  • exec.Command
  • tar
  • 代碼
  • 結果

目標

piveroot切換工作目錄到/merged后,通過docker commit將此時工作目錄的文件系統保存下來,使用tar包將該文件系統打包為tar文件
命令類似 ./mydocker commit myimage然后當前目錄下會得到myimage.tar

注意

  • 執行commit操作是在另一個終端執行的,也就是說容器已啟動并運行,此時在另一個終端執行commit操作的時候不需要在掛載或啟動子進程等操作,直接是設置一個位置來存,而不是像之前一樣聯合掛載后再得到具體的工作目錄地址了

exec.Command

exec.Command("tar", "-czf", imageTar, "-C", mntPath, ".").CombinedOutput()

這段代碼是使用Go語言的標準庫os/exec來執行一個外部命令,具體是調用tar命令來創建一個壓縮的歸檔文件。這里是逐部分解釋:

  • exec.Command: 這是Go語言中用于創建并運行外部命令的對象。它接受一個可變數量的字符串參數,第一個參數是命令名,后面的參數是傳遞給該命令的各個選項和參數。

  • "tar": 這是命令本身,tar是一個用于創建、讀取、更新和管理歸檔文件的工具。

  • "-czf": 這些是傳遞給tar命令的選項。

    • -c 表示創建一個新的歸檔文件。這意味著你要使用 tar 命令來打包當前目錄下一系列文件和目錄成為一個單一的歸檔文件(通常是以 .tar 結尾)。這個過程不會對文件進行壓縮,只是簡單地將它們收集在一起形成一個歸檔文件,便于管理和傳輸。
    • -z 表示在創建歸檔文件時進行gzip壓縮。結合 -c,這會創建一個.tar.gz格式的壓縮歸檔文件。
    • -f 后面跟歸檔文件的名稱。注意,由于-f需要直接跟著文件名,所以在參數列表中,imageTar變量將會作為此選項的值。
  • imageTar: 這是一個變量,代表要創建的歸檔文件的名稱(包括路徑)。例如,如果imageTar的值為/path/to/image.tar.gz,那么這個歸檔文件就會被創建在指定路徑,并命名為image.tar.gz

  • "-C": 這個選項告訴tar在執行操作前先切換到指定的目錄。這里的指定目錄由接下來的參數決定。

  • mntPath: 這也是一個變量,代表一個目錄路徑。結合-C選項,它指定了tar執行操作前應先切換到的目錄。例如,如果mntPath的值為/mnt/mydir,則會在執行打包操作前進入該目錄。

  • ".": 這是一個點字符,代表當前目錄。在tar命令的上下文中,它意味著打包當前目錄下的所有內容。由于之前使用了-C指定了目錄,這里的“當前目錄”就是mntPath所指的目錄。

  • .CombinedOutput(): 這個方法用來執行上述構造的命令,并捕獲其標準輸出和標準錯誤的組合輸出。返回的是一個字節切片,包含命令執行后的輸出文本。這在調試或需要處理命令輸出的場景中非常有用。

綜上所述,這段代碼的功能是:在Go程序中執行一個命令,使用tar工具將mntPath目錄下的所有內容打包成一個gzip壓縮的歸檔文件,并保存為imageTar變量指定的路徑和文件名。

tar

  • tar: 是 tape archive 的縮寫,是一個用于創建、提取和查看 tarball(.tar 文件)的工具。
  • -t 選項:表示列出(list)tar 文件內的內容。當你對一個 .tar 文件使用 -t 選項時,tar 命令將會輸出該歸檔文件中所有文件和目錄的列表,但并不解壓或提取它們。
  • -f 選項:后面跟需要操作的 tar 文件名。-f 是 file 的縮寫,用來指定要處理的歸檔文件。

所以,當你運行 tar -tf somefile.tar 命令時,它會列出 somefile.tar 這個歸檔文件內部的所有文件和目錄結構,每一項占一行,但并不會展開或提取這個歸檔文件的實際內容。這對于快速檢查一個 tar 文件包含哪些內容而不需要真正提取它非常有用。

代碼

https://github.com/FULLK/llkdocker/tree/main/commit_docker
增加一個command

func main(){//定義相關命令app:=cli.NewApp()app.Name="llkdocker"app.Usage="my simple docker -llkdocker "app.Commands=[]cli.Command{runcommand,initcommand,commitcommand,}//Commands 屬性是一個 []cli.Command 類型的切片app.Before=func(context *cli.Context)error{log.SetFormatter(&log.JSONFormatter{})log.SetOutput(os.Stdout)return nil} //在處理命令參數之前先進行的函數if err:=app.Run(os.Args);err!=nil{log.Fatal(err)}
}

判斷參數個數,并最后做出相應執行

var commitcommand = cli.Command{Name:  "commit",Usage: "commit  image",Action: func(context *cli.Context)error {args := context.Args()//commit后參數的作為這里if len(args)<1 {log.Fatal("missing the image name you want to save ")}log.Info(args)contain.Contain_commit(args)return nil},
}

這里注意tar打包好像最后只能生成一個tar文件

func Contain_commit(imagename []string){mnturl:="/home/llk/Desktop/llkdocker/commit_docker/merged"rooturl:="/home/llk/Desktop/llkdocker/commit_docker"/*var params stringfor i := 0; i < len(imagename); i++ {param := rooturl+"/"+imagename[i]+".tar "params =params+param   }	 //得到參數log.Info(params) //類似 路徑/1.tar 路徑/2.tar 但一次只能生成一個鏡像*/imagetar:=rooturl+"/"+imagename[0]+".tar"log.Info(imagetar)if len(imagename)>1{log.Infof("too many image name ,we only can tar the first")}if _,err:=exec.Command("tar","-czf",imagetar,"-C",mnturl,".").CombinedOutput();err!=nil{log.Info(err)log.Fatal("tar error !!!")  //好像一次只能生成一個tar包 }log.Info("commit finish") //tar需要一定時間,這里做最后結束的回現}

結果

先在一個終端啟動
在這里插入圖片描述
然后再啟動另一個終端commit
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15111.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15111.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15111.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

「實用推薦」如何為桌面 移動跨平臺應用選擇UI框架/APP架構?

DevExpress .NET MAUI UI組件庫提供了用于Android和iOS移動開發的高性能UI組件&#xff0c;該庫包括數據網格、圖表、日程、數據編輯器、CollectionView和選項卡組件。 獲取DevExpress .NET MAUI最新正式版下載(Q技術交流&#xff1a;532598169&#xff09; “一次編寫&#…

ABB機器人---基礎編程

目錄 第一章 代碼解釋 1.1 基礎代碼 1.1.2 關于 VAR robtarget pos 1.1.3 關于四元數 1.2 機器人初始化程序 1.3 配置通信 (ProfiNet 示例&#xff0c;ABB RAPID) 1.4 設置干涉區 (ABB RAPID) 1.5 示教軌跡和自動過程 (ABB RAPID) 1.6 配置抓手并進行抓取操作 (ABB RA…

springboot錯誤

錯誤總結 1、使用IDEA 的 initialalzer顯示2、IDEA 新建文件 沒有 java class3、java: 錯誤: 不支持發行版本 22解決方法4、IDEA-SpringBoot項目yml配置文件不自動提示解決辦法 1、使用IDEA 的 initialalzer顯示 IDEA創建SpringBoot項目時出現&#xff1a;Initialization fail…

公認最好用的隨身wifi品牌推薦!歐本VS閃魚VS格行隨身wifi哪款更好用?歐本隨身wifi靠譜嗎?

最近小編后臺私信快被問爆了&#xff0c;都想讓測評一下自己相中的隨身wifi到底行不行。該說不說隨身wifi品牌真是越來越多了&#xff0c;今天就挑選咨詢量最多的三款&#xff1a;格行&#xff0c;歐本&#xff0c;閃魚&#xff01;咱們各方面都實測一下&#xff0c;看看哪款更…

基于ucos-ii操作系統的生產者消費者-問題

目 錄 第1章 題目分析. 1 1.1 生產者線程... 1 1.2 消費者線程... 1 1.3 緩沖區... 1 1.4 進程的同步與互斥... 1 第2章 解決方案. 2 2.1 總體方案... 2 2.2 生產者問題... 2 2.3 消費者問題... 3 2.4 進程問題... 5 第3章 實驗結果. 6 3.1 運行結果... 6 3.2 結果分析... 8 第…

提取 Chrome、Firefox 中儲存的用戶密碼用于憑據發現

操作環境 Chrome 瀏覽器 Version 125.0.6422.112 (Official Build) (64-bit)Firefox 瀏覽器 Version 126.0 (64 位) Chrome 瀏覽器儲存密鑰原理 新的 Chrome 瀏覽器儲存密碼的方案是使用 Chrome 生成的 AES 密鑰對用戶密碼進行加密之后儲存在 Sqlite 數據庫文件中&#xff0c;A…

Qt資源系統用法筆記 qrc

目錄 創建和使用.qrc文件的步驟&#xff1a; 步驟1: 創建.qrc文件 步驟2: 編輯.qrc文件 步驟3: 在代碼中使用資源 步驟4: 編譯和運行 優點和注意事項 c調用&#xff1a; Qt資源系統&#xff08;Qt Resource System&#xff09;提供了一種將應用程序所需的文件&#xff0…

Linux 內核之 mmap 內存映射的原理及源碼解析

文章目錄 前言一、簡介1. mmap 是什么&#xff1f;2. Linux 進程虛擬內存空間 二、mmap 內存映射1. mmap 內存映射的實現過程2. mmap 內存映射流程2.1 mmap 系統調用函數2.2 ksys_mmap_pgoff 函數2.3 vm_mmap_pgoff 函數2.4 do_mmap_pgoff 函數2.5 do_mmap 函數2.6 get_unmappe…

私域流量的真諦:構建并運營屬于你自己的私域生態

大家好&#xff0c;我是來自一家專注于私域電商行業的軟件開發公司的產品經理&#xff0c;擁有超過七年的行業經驗。今天&#xff0c;我想和大家聊聊私域流量的真正含義&#xff0c;以及為何我們應該關注并努力打造屬于自己的私域生態。 什么是私域流量&#xff1f; 私域流量&…

HCIA第二天復習上

延長傳輸距離-------中繼器&#xff08;放大器&#xff09;------物理層設備 可以延長5倍傳輸距離 增加網絡節點數量 網絡拓撲結構 1直線型拓撲 信息安全性差 網絡延遲高傳輸速度慢 2環形拓撲 3星型拓撲 4網狀型拓撲 傳輸效率高&#xff0c;…

【字典樹 馬拉車算法】336. 回文對

本文涉及知識點 字典樹 馬拉車算法 336. 回文對 給定一個由唯一字符串構成的 0 索引 數組 words 。 回文對 是一對整數 (i, j) &#xff0c;滿足以下條件&#xff1a; 0 < i, j < words.length&#xff0c;i ! j &#xff0c;并且words[i] words[j]&#xff08;兩個字…

通過注意力調節實現更好的文本到圖像生成對齊

近年來&#xff0c;生成性AI技術在眾多領域取得了前所未有的進步。大規模預訓練模型的出現激發了各種下游任務中的新應用。這在文本到圖像生成領域尤為明顯&#xff0c;例如Stable Diffusion、DALL-E 2和Imagen等模型已經顯著展示了它們的能力。盡管如此&#xff0c;復雜提示中…

appium篇-windows桌面自動化(一)[環境配置]

1、windows版本&#xff1a;win10 2、winSdk版本 Windows SDK and emulator archive | Microsoft Developer 3、winAppDriver版本 1.2.99 Releases microsoft/WinAppDriver (github.com) ################ 4、python版本 Python 3.9.13 ############### 5、appium版本 Re…

hubilder Android模擬器華為手機連接不上

APP真機測試注意點&#xff1a; 1. 同一個局域網下 2. 手機連接USB模式&#xff08;華為選擇USB配置&#xff1a;音頻來源&#xff09; &#xff0c;開發者模式 3. 實在不行重啟HBuilderX再運行真機 可是卡在了“正在安裝手機端HBuilder調試基座...” 就沒反應了&#xff1f;&…

【高時效通路】

一 高時效通路 1.1 pathchdumper 實時數據拉取、實時數據處理、5分鐘微批dump來加速時效性&#xff0c;具體來說&#xff1a; 實時數據拉取&#xff08;Fetcher&#xff09;&#xff1a;基于Databus Fetcher基建&#xff0c;直接對接F0層實時拉取最新數據&#xff0c;保證該…

Springboot整合Minio對象存儲超級詳細講解以及配置搭建

windows環境下搭建minio步驟 1.從minio官網進行查看詳細信息 地址&#xff1a;https://min.io/里面有詳細的配置信息搭建成功之后如下如所示&#xff1a;用戶名密碼默認情況下為 username&#xff1a;minioadmin password&#xff1a;minioadmin2.搭建成功之后的訪問 地址&…

python - 分割 pytest 的 conftest.py 文件

解決 pytest 的 conftest.py 文件過大問題。 1. 項目目錄結構 project_name ├── LICENSE ├── MANIFEST.in ├── Makefile ├── README.md ├── project_name │ ├── __init__.py │ ├── testing │ │ ├── __init__.py │ │ ├── fixtur…

vue項目實戰 - 如果高效的實現防抖和節流

在Vue項目中&#xff0c;處理高頻事件的優化至關重要&#xff0c;直接影響用戶體驗和應用性能。防抖&#xff08;Debounce&#xff09;和節流&#xff08;Throttle&#xff09;是兩種常用且有效的方法&#xff0c;可以控制事件觸發頻率&#xff0c;減少不必要的資源消耗。如何在…

SEO優化,小白程序員如何做SEO優化流量從0到1

原文鏈接&#xff1a;SEO優化&#xff0c;小白程序員如何做SEO優化流量從0到1 1、SEO是什么&#xff1f; SEO即&#xff1a;搜索引擎優化(Search Engine Optimization)&#xff0c;是一種通過優化網站結構、內容和外部鏈接等因素&#xff0c;提高網站在搜索引擎中的自然排名&…

python愛心樹表白代碼

以下是一個使用Python的turtle模塊來繪制一顆愛心并表白的簡單示例代碼&#xff1a; import turtle import math # 設置屏幕 screen turtle.Screen() screen.bgcolor("black") # 繪制愛心 def draw_heart(t, size): t.speed(9) t.penup() t.goto(0, -size…