diff --git a/src/isolate.bash b/src/isolate.bash index 6c35318..9388c33 100644 --- a/src/isolate.bash +++ b/src/isolate.bash @@ -56,10 +56,20 @@ function app::dlt::isolate() { tar xf "../to_image/${raw_layer}" done - # Create a tarball w/ the isolated files (special find magic to avoid the leading ./ on paths) + # DOCKER BACKGROUND: When you export an image layer to a tarball, Docker creates + # special "whiteout" placeholder files to represent files that were deleted in that + # layer. These files are prefixed with `.wh.`. + # Due to our shenanigans, we need to handle these manually since we're importing the + # tarball directly in as a single image, so the whiteout files are ever removed. + # Instead, let's extract them to a list so we can rm them manually during the build step. + g::info 'Building white-out list' + find . -name '.wh.*' > ../whiteout.list + xargs -a ../whiteout.list rm -f + + # Create a tarball w/ the isolated files g::info 'Creating archive' + tar cf ../isolated.tar . cd .. - find isolated/ \( -type f -o -type d \) -printf "%P\n" | tar cf isolated.tar -C isolated/ -T - # Do a bit of cleanup rm -rf to_image from_image isolated @@ -72,7 +82,7 @@ function app::dlt::isolate() { docker image import isolated.tar "$as_image" > /dev/null else g::info "Creating image $as_image on top of $from_image" - dkr::import_fs_as_layer isolated.tar "$from_image" "$as_image" + dkr::import_fs_as_layer isolated.tar "$from_image" "$as_image" whiteout.list fi fi