From acdfccaae86ee2e73690b56214a06cdfb56b460d Mon Sep 17 00:00:00 2001 From: Bruce Ashfield Date: Tue, 6 Jan 2026 19:59:25 +0000 Subject: image-oci: fix symlink loop on image rebuild Use ln -sfn instead of ln -sf to prevent creating symlinks inside existing symlink target directories. Without -n, if the convenience symlink (e.g., container-base-latest-oci) already exists and points to a directory, ln -sf creates the new symlink inside that directory rather than replacing it, resulting in a self-referencing symlink. This manifests as "Too many levels of symbolic links" errors when container-bundle tries to copy OCI images after a rebuild. Signed-off-by: Bruce Ashfield --- classes/image-oci-sloci-image.inc | 7 ++++--- classes/image-oci-umoci.inc | 8 +++++--- 2 files changed, 9 insertions(+), 6 deletions(-) (limited to 'classes') diff --git a/classes/image-oci-sloci-image.inc b/classes/image-oci-sloci-image.inc index 9248489f..db86ab15 100644 --- a/classes/image-oci-sloci-image.inc +++ b/classes/image-oci-sloci-image.inc @@ -72,18 +72,19 @@ IMAGE_CMD:oci() { fi # create a convenience symlink - ln -sf ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci ${IMAGE_BASENAME}-${OCI_IMAGE_TAG}-oci + # Use -n to avoid creating link inside existing symlink target directory + ln -sfn ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci ${IMAGE_BASENAME}-${OCI_IMAGE_TAG}-oci if [ -n "${OCI_IMAGE_TAR_OUTPUT}" ]; then # move the sloci output to a naming convention that matches what we do with umoci, thie # default creates a subdirectory, so it get the "-dir" in the name mv ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-image.tar ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-dir.tar - ln -sf ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-dir.tar ${IMAGE_BASENAME}-${OCI_IMAGE_TAG}-oci-dir.tar + ln -sfn ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-dir.tar ${IMAGE_BASENAME}-${OCI_IMAGE_TAG}-oci-dir.tar ( cd "${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci" tar -cf ../"${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-image.tar" "." ) - ln -sf "${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-image.tar" ${IMAGE_BASENAME}-${OCI_IMAGE_TAG}-oci.tar + ln -sfn "${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-image.tar" ${IMAGE_BASENAME}-${OCI_IMAGE_TAG}-oci.tar fi } diff --git a/classes/image-oci-umoci.inc b/classes/image-oci-umoci.inc index 9bd154fb..1d4863b3 100644 --- a/classes/image-oci-umoci.inc +++ b/classes/image-oci-umoci.inc @@ -123,13 +123,15 @@ IMAGE_CMD:oci() { tar -cf "$image_name-dir.tar" "$image_name" # create a convenience symlink - ln -sf "$image_name.tar" "${IMAGE_BASENAME}-$image_tag-oci.tar" - ln -sf "$image_name-dir.tar" "${IMAGE_BASENAME}-$image_tag-oci-dir.tar" + # Use -n to avoid creating link inside existing symlink target directory + ln -sfn "$image_name.tar" "${IMAGE_BASENAME}-$image_tag-oci.tar" + ln -sfn "$image_name-dir.tar" "${IMAGE_BASENAME}-$image_tag-oci-dir.tar" fi # We could make this optional, since the bundle is directly runnable via runc rm -rf $image_bundle_name # This is the OCI image directory, which is technically the "image" as specified - ln -sf $image_name ${IMAGE_BASENAME}-$image_tag-oci + # Use -n to avoid creating link inside existing symlink target directory + ln -sfn $image_name ${IMAGE_BASENAME}-$image_tag-oci } -- cgit v1.2.3-54-g00ecf