67 lines
2.0 KiB
Bash
67 lines
2.0 KiB
Bash
|
#!/bin/bash
|
||
|
set -euo pipefail
|
||
|
|
||
|
# Parse command line arguments
|
||
|
while [[ $# -gt 0 ]]; do
|
||
|
key="$1"
|
||
|
case "$key" in
|
||
|
--image)
|
||
|
IMAGE_NAME="$2"
|
||
|
shift
|
||
|
shift
|
||
|
;;
|
||
|
*)
|
||
|
echo "Error: Unknown option: $key"
|
||
|
echo "Usage: $0 --image IMAGE_NAME"
|
||
|
exit 1
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
# Define the path to the temporary directory where the files will be extracted
|
||
|
DESTINATION="/tmp/docker_images/${IMAGE_NAME}"
|
||
|
MANIFEST="${DESTINATION}/manifest.json"
|
||
|
|
||
|
# Define a function to download and extract the Docker image layers
|
||
|
function extract_docker_image {
|
||
|
# Pull image to make sure we have it before we save it.
|
||
|
docker pull "$IMAGE_NAME"
|
||
|
|
||
|
# Save the Docker image as a tar file
|
||
|
echo "Saving Docker image as a tar file..." >&2
|
||
|
docker save "$1" -o "${DESTINATION}/${IMAGE_NAME}.tar"
|
||
|
|
||
|
# Extract the Docker image layers to the destination directory
|
||
|
echo "Extracting Docker image layers..." >&2
|
||
|
mkdir -p "${DESTINATION}/layers"
|
||
|
tar -xf "${DESTINATION}/${IMAGE_NAME}.tar" -C "${DESTINATION}/"
|
||
|
|
||
|
# Rename the layer directories to their respective layer IDs
|
||
|
LAYERS=$(jq -r '.[0].Layers[]' "${MANIFEST}")
|
||
|
|
||
|
# Extract each layer
|
||
|
for LAYER in ${LAYERS}; do
|
||
|
BLOB="${LAYER}"
|
||
|
# Extract the layer tar file to the destination directory
|
||
|
echo "Extracting layer ${LAYER}..." >&2
|
||
|
mkdir -p "${DESTINATION}/$(dirname ${BLOB})"
|
||
|
tar -xf "${DESTINATION}/${BLOB}" -C "${DESTINATION}/layers"
|
||
|
echo "Layer ${LAYER} extracted" >&2
|
||
|
done
|
||
|
}
|
||
|
|
||
|
# Ensure that the user has provided the Docker image name using the --image flag
|
||
|
if [ -z "$IMAGE_NAME" ]; then
|
||
|
echo "Error: Docker image name not provided." >&2
|
||
|
echo "Usage: $0 --image IMAGE_NAME" >&2
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# Create the destination directory if it doesn't already exist
|
||
|
rm -rf "${DESTINATION}"
|
||
|
mkdir -p "${DESTINATION}"
|
||
|
|
||
|
# Call the function to download and extract the Docker image layers
|
||
|
extract_docker_image "$IMAGE_NAME"
|
||
|
|