docker鏡像製作必備技能

正文

使用過docker的都知道dockerfile,其用於定義製作鏡像的流程,由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終創建一個新的鏡像。可參考往期文章學習:docker基礎知識整理

有時候,我們想在原有鏡像基礎上修改、增加文件,由於國內網絡原因,重新制作鏡像會很慢,甚至失敗;或者根本不知道鏡像的dockerfile長什麼樣。改動很小情況下,可以用以下方式製作鏡像。

拿k8s負載均衡器組件ingress-nginx:0.24.1版本爲例:
image.png
如果我們修改了其源碼,並編譯生成nginx-ingress-controller二進制文件,可以用以下方式進行製作新鏡像。

首先用命令:

docker run -ti --rm k8s-deploy/nginx-ingress-controller:0.24.1 bash

將鏡像運行起來。其中-ti表示打開一個交互輸入終端;–rm表示運行停止後自動清理。

運行後可以看到默認用戶爲www-data,a298fe62a4f9表示容器id
image.png

我們可以在容器裏創建目錄:
image.png

重新打開一個shell窗口,用於給容器內複製一個測試文件:

docker cp ingressgroup-upstream.tmpl a298fe62a4f9:/etc/nginx/conf.d/include-server-map/

image.png

複製進去後,當要將其移動到其他位置時,報Permission denied權限不足,因爲默認爲www-data用戶,複製到容器內的ingressgroup-upstream.tmpl屬主:屬組也是root,如果不把root修改爲www-data,肯定會報沒權限的錯。

image.png

通過以下命令重新運行鏡像:

docker run -ti --rm -u 0 k8s-deploy/nginx-ingress-controller:0.24.1 bash

-u 0代表用root用戶運行容器,而不是dockerfile裏指定的用戶,這樣運行後可以看到用戶爲root,記錄容器id:ffdc80f3cce7

image.png

重新執行復制操作:

image

此時就可以隨意移動和修改文件的權限、屬組、屬主了。

image

修改完畢後,執行以下命令將鏡像commit到本地倉庫:

docker commit ffdc80f3cce7 k8s-deploy/nginx-ingress-controller:0.24.1-temp

commit後跟的是容器id,最後跟的是新鏡像名稱。push命令將新鏡像推到遠程harbor倉庫。

image

運行新制作的鏡像,可以看到我們修改的文件。

image

這種方式一般用於測試,弊端是可能會導致鏡像越來越大。


作者簡介

作者:小碗湯,一位熱愛、認真寫作的小夥,目前維護原創公衆號:『我的小碗湯』,專注於寫golang、docker、kubernetes等知識等提升硬實力的文章,期待你的關注。 轉載說明:務必註明來源(註明:來源於公衆號:我的小碗湯, 作者:小碗湯)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章