上雲原生之后不可避免的要操作docker鏡像,打鏡像之前需要編寫dockerfile,但是有時候我們需要根據已有的鏡像還原回dockerfile.
我們可以使用命令 docker save [鏡像id] > ~/image.tar 或 docker save [鏡像name:version] > ~/image.tar,區別在於前者用[鏡像id]導出來的鏡像沒有攜帶 tag信息,需要手動指定!
對於已經保存的鏡像,可以使用 tar -xf image.tar 解開,如下圖:
可以看到有一個manifest.json說明文件、一個*.json文件和很多 文件夾,這里的文件夾就是鏡像的非空層(注意這里是非空層)
我們打開manifest.json說明文件,可以看到 layers(對應解壓縮出來非空層),RepoTags(鏡像的tag),Config對應打鏡像的一些配置文件(*.json)
我們打開這個*.json文件:
可以看到
config:是我們打鏡像時候形成的一些配置,比如開放端口 ExposedPorts,環境變量Env等
history:就是我們打鏡像過程中全部層(包含非空層 和 空層),這里的空層有字段 "empty_layer": true 標示,表示該層存在,但是不占鏡像空間!
舉個例子:
如果你執行 RUN script.sh 命令創建了 really_big_file,然后用 RUN rm really_big_file 命令刪除文件,Docker 鏡像實際生成兩層:一個包含 really_big_file,一個包含 .wh.really_big_file 記錄來刪除它。整個鏡像文件大小不變。
這就是為什么會經常看到像 RUN script.sh && rm really_big_file 這樣的 Dockerfile 命令鏈接在一起——它保障所有更改都合並到一層中。
根據history說明我們基本可以還原 dockerfile文件,但是對於 From Copy等操作不能還原,對於From操作,我們可以 tar -tf layer.tar(第一層鏡像壓縮文件) 查看內容,
基本可以確認指定的 基礎鏡像及版本