Summary
Docker images tagged with Git SHA are not expiring as expected on Quay.io. Currently, SHA-tagged images are set to never expire, leading to storage accumulation.
Current Behavior
Looking at quay.io/kuadrant/developer-portal-controller, images with Git SHA tags (e.g., b2ab687...) do not have an expiry time set.
Expected Behavior
Images should automatically expire based on their tags:
- Images with
main tag: Never expire
- Images with
latest tag: Never expire
- Release tag images (e.g.,
v0.4.0, v1.2.3-alpha.1): Never expire
- Git SHA tagged images: Expire after 3 weeks
- Branch tagged images (non-main branches): Expire after 3 weeks ✅ (already working correctly)
Root Cause
The issue is in .github/workflows/build-image.yaml. When a push to the main branch occurs:
- The metadata action generates multiple tags for a single build:
main, latest, and the Git SHA
- The expiry logic evaluates to
expiry=never because github.ref_name == "main"
- The Docker build uses a single
QUAY_IMAGE_EXPIRY value for all tags via the LABEL quay.expires-after directive
- Result: All tags including the Git SHA inherit
quay.expires-after=never
This is a Docker/Quay limitation - you cannot set different expiry times for different tags in the same image build because the label is set at the image layer level, not per-tag.
Possible Solutions
Option 1: Separate Builds for Different Expiry Requirements
Split the image building into separate jobs with different QUAY_IMAGE_EXPIRY build args:
- Job 1: Build and tag with
main and latest (expiry = never)
- Job 2: Build and tag with Git SHA (expiry = 3w)
Option 2: Use Quay API to Set Tag Expiry Post-Build
After the image is built and pushed, use the Quay API to programmatically set expiration time for the Git SHA tag only.
Additional Context
Summary
Docker images tagged with Git SHA are not expiring as expected on Quay.io. Currently, SHA-tagged images are set to never expire, leading to storage accumulation.
Current Behavior
Looking at quay.io/kuadrant/developer-portal-controller, images with Git SHA tags (e.g.,
b2ab687...) do not have an expiry time set.Expected Behavior
Images should automatically expire based on their tags:
maintag: Never expirelatesttag: Never expirev0.4.0,v1.2.3-alpha.1): Never expireRoot Cause
The issue is in
.github/workflows/build-image.yaml. When a push to themainbranch occurs:main,latest, and the Git SHAexpiry=neverbecausegithub.ref_name == "main"QUAY_IMAGE_EXPIRYvalue for all tags via theLABEL quay.expires-afterdirectivequay.expires-after=neverThis is a Docker/Quay limitation - you cannot set different expiry times for different tags in the same image build because the label is set at the image layer level, not per-tag.
Possible Solutions
Option 1: Separate Builds for Different Expiry Requirements
Split the image building into separate jobs with different
QUAY_IMAGE_EXPIRYbuild args:mainandlatest(expiry = never)Option 2: Use Quay API to Set Tag Expiry Post-Build
After the image is built and pushed, use the Quay API to programmatically set expiration time for the Git SHA tag only.
Additional Context
QUAY_IMAGE_EXPIRY ?= 3wLABEL quay.expires-after=$QUAY_IMAGE_EXPIRY