Open ondrovic opened 3 years ago
+1
That is definitely what I am looking for.
use case: Imagine you somehow accidentally deleted the source files you used to create that container. use case: Imagine you had a small detail when creating this image. You have created many images but this specific one works best but you forgot what setting you used in it, and your source files no longer has that small detail in them.
Any news?
I, too, would appreciate this feature. I did something hacky with docker commit
recently, and being able to check how exactly the files changed in dive
would be very helpful towards the goal of replicating those changes in the build.
+1, FWIW
+1 to this feature
+1
+1
only for docker (I don't use podman)
docker save -o save.tar IMAGE:TAG
can got the image tar file, with layers inside. user can extact file from it.
seems dive
also do it in that way (with docker client lib)
//also that's the reason that dive load slowly
//current version dive seems only analyze file list in tar
https://github.com/wagoodman/dive/blob/v0.10.0/dive/image/docker/engine_resolver.go#L96
layer_list(){
local id="$1"
local file="$2"
tar -Oxf save.tar $id/layer.tar | tar tvf - "$file"
}
layer_extract(){
local id="$1"
local file="$2"
tar -Oxf save.tar $id/layer.tar | tar xvf - "$file"
}
//after docker save
got save.tar
usage demo
layer_list layer_id_seen_in_dive [file_path]
👉️ 💤 $ layer_list 20f751de6380bb8ded7794f97bc970eb2c45f53752236c6419fd6ecfa54e6310 etc/
drwxr-xr-x 0/0 0 2023-03-08 10:06 etc/
-rw------- 0/0 0 2023-03-08 10:05 etc/.pwd.lock
-rw-r--r-- 0/0 3028 2023-03-08 10:06 etc/adduser.conf
drwxr-xr-x 0/0 0 2023-03-08 10:06 etc/alternatives/
-rw-r--r-- 0/0 100 2018-04-16 10:25 etc/alternatives/README
lrwxrwxrwx 0/0 0 2023-03-08 10:06 etc/alternatives/awk -> /usr/bin/mawk
lrwxrwxrwx 0/0 0 2023-03-08 10:06 etc/alternatives/nawk -> /usr/bin/mawk
...
layer_extract layer_id_seen_in_dive [file_path]
👉️ 💤 $ layer_extract 20f751de6380bb8ded7794f97bc970eb2c45f53752236c6419fd6ecfa54e6310 etc/os-release
etc/os-release
$ ll etc/os-release
lrwxrwxrwx 1 root root 21 Sep 6 2021 etc/os-release -> ../usr/lib/os-release
I don't known how to find the layer files in /var/lib/docker
dir directly (it's storage driver related).
on docker 23
with overlay2
storage driver,
I use this script to find the files very roughly
find_layer_by_hash(){
local hash="$1"
local file="$2"
echo " hash: $hash"
local layerdb=`head /var/lib/docker/image/overlay2/layerdb/sha256/*/diff | grep "$hash" -B1 -m1 | grep -o '/.*/' -`
echo "layerdb: $layerdb"
local overlay=`cat $layerdb/cache-id`
echo "overlay: $overlay"
echo "=== /var/lib/docker/overlay2/$overlay/diff"
ls -hl /var/lib/docker/overlay2/$overlay/diff/"$file"
}
USAGE: find_layer_by_hash layer_hash_seen_in_dive [file_path]
👉️ 💤 $ find_layer_by_hash b7e0fa7bfe7f9796f1268cca2e65a8bfb1e010277652cee9a9c9d077a83db3c4 etc/os-release
hash: b7e0fa7bfe7f9796f1268cca2e65a8bfb1e010277652cee9a9c9d077a83db3c4
layerdb: /var/lib/docker/image/overlay2/layerdb/sha256/b7e0fa7bfe7f9796f1268cca2e65a8bfb1e010277652cee9a9c9d077a83db3c4/
overlay: 40c57ca91bfb85eb7226d8397c7832d905ee54bf580e1a5e1d3dde35e46f0e56
=== /var/lib/docker/overlay2/40c57ca91bfb85eb7226d8397c7832d905ee54bf580e1a5e1d3dde35e46f0e56/diff
lrwxrwxrwx 1 root root 21 Sep 6 2021 /var/lib/docker/overlay2/40c57ca91bfb85eb7226d8397c7832d905ee54bf580e1a5e1d3dde35e46f0e56/diff/etc/os-release -> ../usr/lib/os-release
the layer hash:
docker image inspect IMAGE:TAG | jq '.[].RootFS.Layers'
Thanks @yurenchen000 for figuring out the solution. I built a small tool around this which makes extracting layer a bit more easier. https://github.com/Kartik1397/docker-image-layer-explorer
genius hint from @yurenchen000. very nice & thx for that approach
Using docker create
and docker cp
is much simpler: https://unix.stackexchange.com/questions/331645/extract-file-from-docker-image
Any chance of adding a view that when you select a file you can view the contents of that file?