docker容器commit打包越來越大的原因分析及解決
docker容器commit打包越來越大
一、背景和原因
docker容器就是以便于移植和部署著稱。那么在docker使用過程中,少不了對容器進行反復的的打包和部署。
為了追求容器完整性,往往使用docker commit 容器ID 新鏡像名:tag 來操作,再使用save/load對其進行打包/部署鏡像。
但是根據(jù)上面的命令操作往往發(fā)現(xiàn),即使很小的容器經(jīng)過上述步驟操作幾次后得到的鏡像仍舊會變得很大很大(即使容器內的文件都被刪掉了)。
這主要是由于:
docker鏡像的構建方式是以層的概念來實現(xiàn)的,在容器內所做的所有操作都會在構建鏡像時運行一遍,每一個操作所涉及到的內存空間, 都會成為鏡像文件的一部分。
看到的大都是壓縮容器根目錄制作基礎鏡像或者操作Dockerfile之類的,相對就比較復雜,或者不是我們想要的答案。
以下參考文章中的方法1給出比較詳細好用的解決方法步驟。
二、解決方法
為了減少鏡像文件所占內容空間,采用export直接打包容器,然后通過import導入鏡像,繼而展開成容器。
1、可采用export命令打包容器生成鏡像文件
docker export -o name.tar 容器ID 或者docker export 容器ID > name.tar
注:此時必須記下當前容器的COMMAND內容,后面要用到。
2、加載成鏡像
生成的tar鏡像包就可以進行移植和部署,假設換了一臺機器后部署該鏡像,加載鏡像可采用的命令:
docker import name.tar 容器name:tag
3、將鏡像展開成容器
如果正常使用的docker run命令時將會出現(xiàn)報錯:
docker: Error response from daemon: No command specified.
See 'docker run --help'.
此時就體現(xiàn)第1步中需要記住的COMMAND內容的重要性了。
如果原環(huán)境還在,可通過 docker ps --no-trunc 查看你原容器的COMMAND。假設原容器的COMMAND為"bash"。
將原來使用export導出鏡像時的容器COMMAND內容追加到要啟動容器后面即可:
docker run -itd --restart=always --name xxx xxx:latest "bash"
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
前端實現(xiàn)自動化部署docker+Jenkins的完整過程
在現(xiàn)代前端開發(fā)中自動化部署變得越來越重要,通過使用Docker、Jenkins和Nginx,我們可以實現(xiàn)高效的前端自動化部署,這篇文章主要介紹了前端實現(xiàn)自動化部署docker+Jenkins的完整過程,需要的朋友可以參考下2025-07-07
docker+ddns實現(xiàn)動態(tài)域名的示例代碼
本文主要介紹了Docker使用ddns-go實現(xiàn)動態(tài)域名,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-11-11
用Docker部署Fenrus導航頁:打造專屬的極簡高效瀏覽器首頁
該文章介紹了使用Fenrus和cpolar搭建個性化的瀏覽器首頁的方法,包括使用Docker部署Fenrus、配置cpolar實現(xiàn)公網(wǎng)訪問等步驟,并詳細闡述了部署過程和使用方法,感興趣的朋友跟隨小編一起看看吧2026-04-04
docker創(chuàng)建鏡像并上傳云端服務器的實現(xiàn)示例
鏡像是一種輕量級、可執(zhí)行的獨立軟件包,用來打包軟件運行環(huán)境和基于運行環(huán)境開發(fā)的軟件,本文介紹了如何使用Docker創(chuàng)建鏡像,并將其上傳到云端,感興趣的可以了解一下2023-08-08
Docker Volumn容器間共享數(shù)據(jù)的實現(xiàn)
這篇文章主要介紹了Docker Volumn容器間共享數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01

