Help us improve
Share bugs, ideas, or general feedback.
GitLab container registry operations via API. ALWAYS use this skill when user wants to: (1) list container repositories, (2) view/delete image tags, (3) clean up old images, (4) manage Docker registry.
npx claudepluginhub grandcamel/gitlab-assistant-skills --plugin gitlab-assistant-skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/gitlab-assistant-skills:gitlab-containerThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Container registry management for GitLab using `glab api` raw endpoint calls.
Recommends full git SHA tagging for Docker images to enable instant code traceability in production incidents. Covers OCI labels, registry retention policies, and pitfalls of latest, date, or env tags.
Manages container registries including Docker Hub, AWS ECR, GCP Artifact Registry, Azure ACR; automates tagging, lifecycle policies, replication, scanning, and access control.
Configures container image registries (ghcr.io, Docker Hub, Harbor) with automated scanning, tagging strategies, retention policies, and CI/CD integration. Use for private registries, migration, or vulnerability scanning.
Share bugs, ideas, or general feedback.
Container registry management for GitLab using glab api raw endpoint calls.
| Operation | Command Pattern | Risk |
|---|---|---|
| List repositories | glab api projects/:id/registry/repositories | - |
| Get repository | glab api projects/:id/registry/repositories/:repo_id | - |
| Delete repository | glab api projects/:id/registry/repositories/:repo_id -X DELETE | ⚠️⚠️⚠️ |
| List tags | glab api projects/:id/registry/repositories/:repo_id/tags | - |
| Get tag | glab api projects/:id/registry/repositories/:repo_id/tags/:tag | - |
| Delete tag | glab api projects/:id/registry/repositories/:repo_id/tags/:tag -X DELETE | ⚠️⚠️ |
| Bulk delete tags | glab api projects/:id/registry/repositories/:repo_id/tags -X DELETE -f ... | ⚠️⚠️⚠️ |
Risk Legend: - Safe | ⚠️ Caution | ⚠️⚠️ Warning | ⚠️⚠️⚠️ Danger
ALWAYS use when:
NEVER use when:
Required Token Scopes: read_registry, write_registry (for delete operations), or api
Permissions:
Note: Container Registry must be enabled for the project.
# List all repositories in project
glab api projects/123/registry/repositories --method GET
# With pagination
glab api projects/123/registry/repositories --paginate
# Include tags count
glab api "projects/123/registry/repositories?tags_count=true" --method GET
# Using project path
glab api "projects/$(echo 'mygroup/myproject' | jq -Rr @uri)/registry/repositories"
# Get specific repository
glab api projects/123/registry/repositories/456 --method GET
# With tags count
glab api "projects/123/registry/repositories/456?tags_count=true" --method GET
Warning: This deletes the repository and ALL its tags!
# Delete entire repository
glab api projects/123/registry/repositories/456 --method DELETE
# List all tags
glab api projects/123/registry/repositories/456/tags --method GET
# With pagination
glab api projects/123/registry/repositories/456/tags --paginate
# Get specific tag
glab api projects/123/registry/repositories/456/tags/latest --method GET
# Get tag with digest info
glab api projects/123/registry/repositories/456/tags/v1.0.0 --method GET
# Delete specific tag
glab api projects/123/registry/repositories/456/tags/v1.0.0 --method DELETE
# Delete 'latest' tag
glab api projects/123/registry/repositories/456/tags/latest --method DELETE
# Delete tags matching regex (keep none)
glab api projects/123/registry/repositories/456/tags --method DELETE \
-f name_regex_delete=".*"
# Delete all tags except last 5
glab api projects/123/registry/repositories/456/tags --method DELETE \
-f name_regex_delete=".*" \
-f keep_n=5
# Delete tags older than 30 days, keep last 10
glab api projects/123/registry/repositories/456/tags --method DELETE \
-f name_regex_delete=".*" \
-f keep_n=10 \
-f older_than="30d"
# Delete only dev/snapshot tags
glab api projects/123/registry/repositories/456/tags --method DELETE \
-f name_regex_delete="^dev-.*"
# Keep tags matching pattern (exclude from deletion)
glab api projects/123/registry/repositories/456/tags --method DELETE \
-f name_regex_delete=".*" \
-f name_regex_keep="^v[0-9]+\\.[0-9]+\\.[0-9]+$" \
-f keep_n=5
| Option | Type | Description |
|---|---|---|
name_regex_delete | string | Regex pattern for tags to delete |
name_regex_keep | string | Regex pattern for tags to keep (overrides delete) |
keep_n | integer | Number of latest tags to keep |
older_than | string | Delete tags older than duration (e.g., 30d, 1w) |
project_id=123
# Get all repositories
repos=$(glab api projects/$project_id/registry/repositories --paginate)
# For each repository, list tags
echo "$repos" | jq -r '.[].id' | while read repo_id; do
repo_name=$(echo "$repos" | jq -r ".[] | select(.id == $repo_id) | .path")
echo "=== $repo_name ==="
glab api projects/$project_id/registry/repositories/$repo_id/tags | \
jq -r '.[].name'
echo ""
done
project_id=123
repo_id=456
# List tags with sizes
glab api projects/$project_id/registry/repositories/$repo_id/tags --paginate | \
jq -r 'sort_by(.total_size) | reverse | .[] | "\(.name): \(.total_size / 1024 / 1024 | floor) MB"'
project_id=123
repo_id=456
# Delete dev images older than 7 days, keep last 3
glab api projects/$project_id/registry/repositories/$repo_id/tags --method DELETE \
-f name_regex_delete="^dev-.*" \
-f older_than="7d" \
-f keep_n=3
project_id=123
repo_id=456
# Delete everything except semver tags, keep last 10
glab api projects/$project_id/registry/repositories/$repo_id/tags --method DELETE \
-f name_regex_delete=".*" \
-f name_regex_keep="^v[0-9]+\\.[0-9]+\\.[0-9]+$" \
-f keep_n=10
project_id=123
# Get total size per repository
glab api "projects/$project_id/registry/repositories?tags_count=true" --paginate | \
jq -r '.[] | "\(.path): \(.tags_count) tags"'
# Get detailed size info for a repository
repo_id=456
glab api projects/$project_id/registry/repositories/$repo_id/tags --paginate | \
jq '[.[] | .total_size] | add / 1024 / 1024 | "Total: \(. | floor) MB"'
project_id=123
repo_id=456
# Note: Untagged images are automatically cleaned up by GitLab
# You can trigger cleanup by deleting all tags and then the repo
# Or wait for the scheduled cleanup job
project_id=123
repo_id=456
# Export tag names
glab api projects/$project_id/registry/repositories/$repo_id/tags --paginate | \
jq -r '.[].name' > tags_backup.txt
# Export with details
glab api projects/$project_id/registry/repositories/$repo_id/tags --paginate | \
jq -r '.[] | [.name, .created_at, .total_size] | @csv' > tags_details.csv
GitLab Container Registry URLs follow this pattern:
registry.gitlab.com/<namespace>/<project>
registry.gitlab.com/<namespace>/<project>/<image>
For example:
registry.gitlab.com/mygroup/myprojectregistry.gitlab.com/mygroup/myproject/appregistry.gitlab.com/mygroup/myproject/api| Issue | Cause | Solution |
|---|---|---|
| 403 Forbidden | No registry access | Check token scopes, need read_registry |
| 404 Not Found | Registry disabled or repo doesn't exist | Enable registry in project settings |
| Delete fails | Insufficient permissions | Need Developer+ role or write_registry scope |
| Bulk delete no effect | No matching tags | Check regex pattern |
| Old images persist | GitLab cleanup job | Wait for scheduled cleanup or delete manually |
older_than and keep_nname_regex_keep to preserve important versions