
Container Scanning
- 93 installs
- 44 repo stars
- Updated May 22, 2026
- bagelhole/devops-security-agent-skills
Container Scanning is a Claude skill that scans container images for vulnerabilities and misconfigurations using Trivy, Grype, and cloud-native tools.
About
Container Scanning is a skill for finding vulnerabilities and misconfigurations in container images. It compares tools like Trivy, Grype, Clair, Snyk Container, and Docker Scout, and shows how to wire scans into CI with severity thresholds and SARIF output. A developer uses it to build container security gates or to scan registry images for compliance.
- Scan container images with Trivy, Grype, and Docker Scout for CVEs
- Add container security gates to GitHub Actions and GitLab CI (SARIF, exit codes)
- Enforce policies at admission with OPA Gatekeeper and Kyverno
Container Scanning by the numbers
- 93 all-time installs (skills.sh)
- Ranked #1,038 of 2,203 Security skills by installs in the Skillselion catalog
- Data as of Jul 28, 2026 (Skillselion catalog sync)
container-scanning capabilities & compatibility
- Capabilities
- dependency scanning · container hardening · dast scanning
- Works with
- docker · kubernetes · github · gitlab · aws · azure · gcp
- Use cases
- security audit · ci cd · devops
What container-scanning says it does
Scan container images for vulnerabilities and security misconfigurations.
# Exit code on vulnerability trivy image --exit-code 1 --severity CRITICAL myapp:latest
npx skills add https://github.com/bagelhole/devops-security-agent-skills --skill container-scanningAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 93 |
|---|---|
| repo stars | ★ 44 |
| Last updated | May 22, 2026 |
| Repository | bagelhole/devops-security-agent-skills ↗ |
What it does
Scan a container image for CVEs with Trivy or Grype and fail the CI build on HIGH or CRITICAL findings.
Who is it for?
Developers adding container vulnerability gates to CI or scanning registry images for compliance.
Skip if: Hardening the runtime configuration of a container (see container-hardening) or scanning source dependencies only.
When should I use this skill?
Building container images, implementing container security gates, or scanning registry images.
What you get
A CI pipeline that scans images with Trivy or Grype and fails on HIGH/CRITICAL CVEs, plus admission policies.
- Trivy/Grype scan commands
- GitHub Actions and GitLab CI scan jobs
- OPA Gatekeeper and Kyverno policies
By the numbers
- Tool-comparison table of 5 scanners (Trivy, Grype, Clair, Snyk Container, Docker Scout)
Files
Container Scanning
Scan container images for vulnerabilities and security misconfigurations.
When to Use This Skill
Use this skill when:
- Building container images
- Implementing container security gates
- Scanning registry images
- Meeting compliance requirements
- Hardening container deployments
Prerequisites
- Container runtime (Docker, Podman)
- Container images to scan
- Scanning tool installation
Tool Comparison
| Tool | License | Speed | Features |
|---|---|---|---|
| Trivy | OSS | Fast | Comprehensive, IaC |
| Grype | OSS | Fast | Accurate, SBOM |
| Clair | OSS | Medium | Registry integration |
| Snyk Container | Commercial | Fast | Fix suggestions |
| Docker Scout | Commercial | Fast | GitHub integration |
Trivy
Installation
# Linux
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
# macOS
brew install trivy
# Docker
docker pull aquasec/trivyImage Scanning
# Scan local image
trivy image myapp:latest
# Scan remote image
trivy image nginx:1.25
# JSON output
trivy image --format json -o results.json myapp:latest
# Filter by severity
trivy image --severity HIGH,CRITICAL myapp:latest
# Ignore unfixed vulnerabilities
trivy image --ignore-unfixed myapp:latest
# Exit code on vulnerability
trivy image --exit-code 1 --severity CRITICAL myapp:latestFilesystem Scanning
# Scan project directory
trivy fs /path/to/project
# Scan Dockerfile
trivy config Dockerfile
# Scan Kubernetes manifests
trivy config k8s/Configuration
# trivy.yaml
timeout: 10m
severity:
- HIGH
- CRITICAL
ignore-unfixed: true
exit-code: 1
vulnerability:
type:
- os
- library
scan:
file-patterns:
- "Dockerfile"
- "*.yaml"CI Integration
# GitHub Actions
name: Container Security
on:
push:
branches: [main]
pull_request:
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build image
run: docker build -t myapp:${{ github.sha }} .
- name: Run Trivy
uses: aquasecurity/trivy-action@master
with:
image-ref: 'myapp:${{ github.sha }}'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'
exit-code: '1'
- name: Upload results
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: 'trivy-results.sarif'Grype
Installation
# Linux/macOS
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b /usr/local/bin
# Homebrew
brew install grypeUsage
# Scan image
grype myapp:latest
# Scan from SBOM
grype sbom:./sbom.json
# JSON output
grype myapp:latest -o json > results.json
# Filter severity
grype myapp:latest --fail-on high
# Scan directory
grype dir:/path/to/projectConfiguration
# .grype.yaml
check-for-app-update: false
fail-on-severity: high
output: "json"
scope: "Squashed"
ignore:
- vulnerability: CVE-2023-12345
reason: "False positive"
expires: "2024-12-31"Docker Scout
Usage
# Enable Docker Scout
docker scout quickview myapp:latest
# Full CVE report
docker scout cves myapp:latest
# Compare images
docker scout compare myapp:v1 myapp:v2
# Recommendations
docker scout recommendations myapp:latestCI Integration
- name: Docker Scout
uses: docker/scout-action@v1
with:
command: cves
image: ${{ env.IMAGE_NAME }}
sarif-file: scout-results.sarif
summary: trueRegistry Integration
Amazon ECR
# Enable scan on push
aws ecr put-image-scanning-configuration \
--repository-name myapp \
--image-scanning-configuration scanOnPush=true
# Get scan findings
aws ecr describe-image-scan-findings \
--repository-name myapp \
--image-id imageTag=latest
# Start manual scan
aws ecr start-image-scan \
--repository-name myapp \
--image-id imageTag=latestAzure ACR
# Enable Defender for Containers
az security pricing create \
--name Containers \
--tier Standard
# View scan results in Azure Portal or:
az acr repository show \
--name myregistry \
--image myapp:latestGoogle Artifact Registry
# Enable vulnerability scanning
gcloud artifacts repositories update myrepo \
--location=us-central1 \
--enable-vulnerability-scanning
# View vulnerabilities
gcloud artifacts docker images describe \
us-central1-docker.pkg.dev/project/myrepo/myapp:latest \
--show-package-vulnerabilityAdmission Controllers
OPA Gatekeeper
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
name: k8sallowedrepos
spec:
crd:
spec:
names:
kind: K8sAllowedRepos
validation:
openAPIV3Schema:
properties:
repos:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8sallowedrepos
violation[{"msg": msg}] {
container := input.review.object.spec.containers[_]
satisfied := [good | repo = input.parameters.repos[_]; good = startswith(container.image, repo)]
not any(satisfied)
msg := sprintf("container <%v> has an invalid image repo <%v>", [container.name, container.image])
}Kyverno
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-image-scan
spec:
validationFailureAction: enforce
rules:
- name: check-vulnerabilities
match:
resources:
kinds:
- Pod
verifyImages:
- image: "*"
attestations:
- predicateType: cosign.sigstore.dev/attestation/vuln/v1
conditions:
- all:
- key: "{{ scanner.result.summary.criticalCount }}"
operator: Equals
value: "0"Scanning Policies
Policy Definition
# scan-policy.yaml
policies:
- name: critical-vulnerabilities
description: Block images with critical CVEs
severity: CRITICAL
action: block
- name: high-vulnerabilities
description: Warn on high severity CVEs
severity: HIGH
action: warn
max_count: 5
- name: age-policy
description: Block images older than 30 days
max_age_days: 30
action: block
- name: base-image
description: Only allow approved base images
allowed_bases:
- alpine:3.18
- ubuntu:22.04
- python:3.11-slimCommon Issues
Issue: False Positives
Problem: Scanner reports non-exploitable vulnerabilities Solution: Use ignore files, validate with context
Issue: Slow Scans
Problem: Scanning takes too long Solution: Use caching, scan incrementally, optimize image layers
Issue: Unfixed Vulnerabilities
Problem: No patch available for CVE Solution: Update base image, implement compensating controls
Best Practices
- Scan in CI/CD pipeline
- Use minimal base images (Alpine, distroless)
- Update base images regularly
- Implement admission control
- Track vulnerabilities over time
- Set severity thresholds
- Document accepted risks
- Use multi-stage builds
Related Skills
- docker-management - Container basics
- container-hardening - Security hardening
- kubernetes-hardening - K8s security
Related skills
FAQ
How do I fail a build when an image has critical CVEs?
Run trivy image with --exit-code 1 --severity CRITICAL, or grype with --fail-on high, so the CI step returns non-zero.
Which container scanners does this cover?
It compares Trivy, Grype, Clair, Snyk Container, and Docker Scout, and shows registry-native scanning for ECR, ACR, and Artifact Registry.