The ContainerCrop
GitHub Action allows you to delete unwanted GitHub Container Registry (GHCR) images directly from your CI workflows. It offers a flexible way to manage your container images by specifying criteria such as cut-off date, and tag filtering.
image-name
: Required The name of the image you want to delete.cut-off
: Required The cut-off date for deleting images older than this date. Must include a timezone, e.g., '2 days ago UTC'.token
: Required A personal access token with read and delete scopes.untagged-only
: Restrict deletions to images without tags. Default:false
.skip-tags
: Restrict deletions to images without specific tags. Supports Unix-shell style wildcards.keep-at-least
: How many matching images to keep, regardless of other conditions. Default:0
.filter-tags
: Comma-separated list of tags to consider for deletion. Supports Unix-shell style wildcards.dry-run
: If set totrue
, the action will not actually delete images. Instead, it will print out what would have been deleted. Default:false
.
Here is an example workflow that uses the ContainerCrop
action to delete images:
name: Clean Up Container Registry
on:
schedule:
- cron: '0 0 * * *' # Runs every day at midnight
jobs:
cleanup:
runs-on: ubuntu-latest
steps:
- name: Delete untagged images older than 30 days
uses: peterstolz/[email protected]
with:
image-name: 'your-image-name'
cut-off: '30 days ago UTC'
token: ${{ secrets.GITHUB_TOKEN }}
untagged-only: 'true'
keep-at-least: '5'
dry-run: 'true'
If you have multiple images you can use the matrix strategy to apply the same policies to them:
jobs:
delete-images:
runs-on: ubuntu-latest
strategy:
matrix:
image: [container1, container2, container3, container4]
steps:
- name: Delete old tagged images older than one week keeping 7
uses: peterstolz/[email protected]
with:
image-name: my-repo-name/${{ matrix.image }}
cut-off: 'a week ago UTC'
token: ${{ secrets.YOUR_TOKEN }}
filter-tags: "*.*.*"
keep-at-least: '7'
dry-run: 'true'
- name: Delete all untagged images older than 2 days
uses: peterstolz/[email protected]
with:
image-name: my-repo-name/${{ matrix.image }}
cut-off: 'two days ago UTC'
token: ${{ secrets.YOUR_TOKEN }}
untagged-only: 'true'
dry-run: 'true'
- Ensure that the
token
provided has the necessary permissions to read and delete container images. - The
cut-off
input is crucial for determining which images are considered "old" and eligible for deletion. - Use the
dry-run
option to safely check what would be deleted before performing actual deletions.
For more detailed information, refer to the test cases in ./containercrop/test_retention.py