91 lines
3.1 KiB
Bash
Executable file
91 lines
3.1 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
# This script requires an OCI IMAGE Name to pull.
|
|
# The script generates a SOURCE Image based on the OCI Image
|
|
# Script must be executed on the same OS or newer as the image.
|
|
if test $# -lt 2 ; then
|
|
echo Usage: $(basename $0) IMAGE CONTEXT_DIR [EXTRA_SRC_DIR]
|
|
exit 1
|
|
fi
|
|
export IMAGE=$1
|
|
export SRC_RPM_DIR=$(pwd)/SRCRPMS
|
|
export SRC_IMAGE=$1-src
|
|
export CONTEXT_DIR=$2
|
|
export EXTRA_SRC_DIR=$3
|
|
export IMAGE_CTR=$(buildah from ${IMAGE})
|
|
export IMAGE_MNT=$(buildah mount ${IMAGE_CTR})
|
|
#
|
|
# From the executable image, get the RELEASEVER of the image
|
|
#
|
|
RELEASE=$(rpm -q --queryformat "%{VERSION}\n" --root $IMAGE_MNT -f /etc/os-release)
|
|
#
|
|
# From the executable image, list the SRC RPMS used to build the image
|
|
#
|
|
SRC_RPMS=$(rpm -qa --root ${IMAGE_MNT} --queryformat '%{SOURCERPM}\n' | grep -v '^gpg-pubkey' | sort -u)
|
|
buildah umount ${IMAGE_CTR}
|
|
buildah rm ${IMAGE_CTR}
|
|
|
|
#
|
|
# For each SRC_RPMS used to build the executable image, download the SRC RPM
|
|
# and generate a layer in the SRC RPM.
|
|
#
|
|
mkdir -p ${SRC_RPM_DIR}
|
|
pushd ${SRC_RPM_DIR} > /dev/null
|
|
export SRC_CTR=$(buildah from scratch)
|
|
for srpm in ${SRC_RPMS}; do
|
|
if [ ! -f ${srpm} ]; then
|
|
RPM=$(echo ${srpm} | sed 's/.src.rpm$//g')
|
|
dnf download --release $RELEASE --source $RPM || continue
|
|
fi
|
|
echo "Adding ${srpm}"
|
|
touch --date=@`rpm -q --qf '%{buildtime}' ${srpm}` ${srpm}
|
|
buildah add ${SRC_CTR} ${srpm} /RPMS/
|
|
buildah config --created-by "/bin/sh -c #(nop) ADD file:$(sha256sum ${srpm} | cut -f1 -d' ') in /RPMS" ${SRC_CTR}
|
|
export IMG=$(buildah commit --omit-timestamp --disable-compression --rm ${SRC_CTR})
|
|
export SRC_CTR=$(buildah from ${IMG})
|
|
done
|
|
popd > /dev/null
|
|
#
|
|
# If the caller specified a context directory,
|
|
# add it to the CONTEXT DIR in SRC IMAGE
|
|
#
|
|
if [ ! -z "${CONTEXT_DIR}" ]; then
|
|
CONTEXT_DIR=$(cd ${CONTEXT_DIR}; pwd)
|
|
buildah add ${SRC_CTR} ${CONTEXT_DIR} /CONTEXT
|
|
buildah config --created-by "/bin/sh -c #(nop) ADD file:$(cd ${CONTEXT_DIR}; tar cf - . | sha256sum -| cut -f1 -d' ') in /CONTEXT" ${SRC_CTR}
|
|
export IMG=$(buildah commit --omit-timestamp --rm ${SRC_CTR})
|
|
export SRC_CTR=$(buildah from ${IMG})
|
|
fi
|
|
|
|
#
|
|
# If the caller specified a extra directory,
|
|
# add it to the CONTEXT DIR in SRC IMAGE
|
|
#
|
|
if [ ! -z "${EXTRA_SRC_DIR}" ]; then
|
|
buildah add ${SRC_CTR} ${EXTRA_SRC_DIR} /EXTRA
|
|
buildah config --created-by "/bin/sh -c #(nop) ADD file:$(cd ${EXTRA_SRC_DIR}; tar cf - . | sha256sum -| cut -f1 -d' ') in /CONTEXT" ${SRC_CTR}
|
|
export IMG=$(buildah commit --omit-timestamp --rm ${EXTRA_SRC_CTR})
|
|
export SRC_CTR=$(buildah from ${IMG})
|
|
fi
|
|
|
|
# Cleanup and remove source container
|
|
buildah rm ${SRC_CTR}
|
|
|
|
#
|
|
# Add the final name to our image
|
|
#
|
|
buildah tag $IMG $SRC_IMAGE
|
|
|
|
## if an output directory is provided then save a copy to it
|
|
## XXX(vbatts) this is not working inside a container like `quay.io/buildah/stable` yet
|
|
if [ -n "${OUTPUT_DIR}" ] ; then
|
|
mkdir -p "${OUTPUT_DIR}"
|
|
skopeo copy containers-storage:"${IMG}" oci:"${OUTPUT_DIR}"/
|
|
fi
|
|
|
|
# Push SRC_IMAGE to Registry
|
|
# buildah push $SRC_IMAGE REGISTRY_NAME/$SRC_IMAGE
|
|
|
|
# vim:set shiftwidth=4 softtabstop=4 expandtab:
|