刪除docker容器中內(nèi)容后打包鏡像不變小問題及解決
問題
之前一直有這個問題困擾我,不知道大家有沒有遇到過,當(dāng)我們在容器中部署某個軟件時(shí)如果軟件的壓縮包比較大那我們可能需要把壓縮包刪除后再去做鏡像,此時(shí)你會發(fā)現(xiàn)鏡像還是兩個壓縮包左右的大小,甚至刪除后鏡像可能會更大,這個問題就很容易導(dǎo)致鏡像越來越大無法維護(hù),最近找到了一個解決方法,在這里分享一下
分析
這個跟docker的原理有關(guān)系,因?yàn)殓R像是按照層存儲,這樣做最大好處很直觀,版本更新時(shí)只需要下載軟件的下一層相當(dāng)于是軟件的增量包大概是這個意思,而如果你不分層就需要下載軟件的全量包這樣的話十分麻煩。
用戶既可以使用 docker load 來導(dǎo)入鏡像存儲文件到本地鏡像庫,也可以使用 docker import 來導(dǎo)入一個容器快照到本地鏡像庫。
這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時(shí)的快照狀態(tài)),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導(dǎo)入時(shí)可以重新指定標(biāo)簽等元數(shù)據(jù)信息。
解決
知道了原因的話那解決也會相對簡單一些,既然docker load會保存文件的歷史記錄和原數(shù)據(jù),那我們使用docker import導(dǎo)入容器的快照就可以了。
大概就是恢復(fù)到打包容器時(shí)候的樣子,是一個快照,沒有歷史記錄。
導(dǎo)出容器
如果要導(dǎo)出本地某個容器,可以使用 docker export 命令
格式如下:
docker export ContainerId > containerPackage.tar
ContainerId 代表容器id,containerPackage.tar壓縮包名稱這個無所謂
查看容器id:

導(dǎo)出容器快照為tar文件

這樣將導(dǎo)出容器快照到本地文件,等待完成,查看文件

導(dǎo)入容器快照
使用 docker import 從容器快照文件中再導(dǎo)入為鏡像
格式如下:
cat edas.tar | docker import - luntek/centos_edatest:1.0
edas.tar為容器快照,luntek應(yīng)該是倉庫名稱,centos_edatest是項(xiàng)目名稱

上傳鏡像
docker push luntek/images_name:tag
如果docker鏡像太大上傳的過程中可能會報(bào)錯Retrying in 10 second
解決:
編輯/etc/selinux/config文件,關(guān)閉SELINUX,將值設(shè)置為disabled
vi /etc/selinux/config
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker使用root用戶進(jìn)入容器的幾種方法小結(jié)
很多時(shí)候,拉取運(yùn)行的容器,進(jìn)入時(shí),是非root賬戶,也不知道當(dāng)前賬戶的用戶密碼,甚至無賬戶,但在使用docker時(shí),有時(shí)候需要以root用戶權(quán)限進(jìn)入容器進(jìn)行操作,所以本文介紹了Docker使用root用戶進(jìn)入容器的幾種方法,需要的朋友可以參考下2025-09-09
vscode進(jìn)入服務(wù)器docker容器的方法
這篇文章主要介紹了vscode進(jìn)入服務(wù)器docker容器的方法,首先要確保已經(jīng)運(yùn)行docker容器,已經(jīng)用vscode鏈接服務(wù)器,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-04-04
如何解決docker-compose網(wǎng)段路由沖突,docker-compose自定義網(wǎng)絡(luò)
這篇文章主要介紹了如何解決docker-compose網(wǎng)段路由沖突,docker-compose自定義網(wǎng)絡(luò)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
docker安裝opengauss數(shù)據(jù)庫配置過程詳解
這篇文章主要為大家介紹了docker安裝opengauss數(shù)據(jù)庫配置過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Docker教程之dockerfile構(gòu)建centos鏡像
這篇文章主要介紹了Docker教程之dockerfile構(gòu)建centos鏡像的相關(guān)資料,需要的朋友可以參考下2022-11-11

