Course contentsShow
← Docker, Kubernetes & CI/CD
Lesson 617 of 8029. CI/CD Pipeline EngineeringFree lesson

Scanning Container Images for Vulnerabilities

Learners will integrate automated vulnerability scanning tools into the CI pipeline to block the deployment of images containing known security exploits.

In this lesson, you will learn how to transition from simply identifying vulnerabilities to actively blocking insecure images from reaching your production environment.

While scanning an image is a vital audit step, the true power of an automated CI/CD pipeline lies in enforcing a "security gate." By integrating vulnerability scanning directly into your build process, you ensure that any image containing critical or high-severity Common Vulnerabilities and Exposures (CVEs) triggers a pipeline failure, effectively halting the deployment.

Implementing the Security Gate

Most enterprise scanning tools (such as Trivy, Clair, or Grype) provide a CLI flag that allows you to define a severity threshold. In your CI pipeline, you don't just run the scan; you interpret the exit code of that scan to determine if the pipeline should proceed.

Consider this example using trivy in a GitLab or GitHub Actions workflow:

# Example: Blocking a build based on severity
test-vulnerability-scan:
  script:
    - docker build -t my-app:$CI_COMMIT_SHA .
    # --exit-code 1 ensures the pipeline fails if vulnerabilities are found
    # --severity CRITICAL ensures we only block on the most dangerous flaws
    - trivy image --exit-code 1 --severity CRITICAL my-app:$CI_COMMIT_SHA

Why This Matters

If the scan identifies a critical vulnerability, the tool returns a non-zero exit code. Because standard CI/CD runners interpret a non-zero exit code as a task failure, the subsequent "Deploy" or "Push to Registry" stages are never executed. This creates a hard barrier that prevents human error or "lazy" commits from polluting your production container registry with known exploitable software.

When implementing this, keep two things in mind:

  1. Define your risk tolerance: Don’t block on all vulnerabilities initially, or you will encounter "alert fatigue" and may paralyze your deployment velocity. Start by blocking CRITICAL issues and iterate toward HIGH as your team matures.
  2. Handle exceptions: Sometimes, a critical vulnerability exists with no current patch. Ensure your security process includes a mechanism for "CVE whitelisting" via configuration files so you can temporarily bypass a block when a fix is unavailable.

Key Takeaway: By binding the CI pipeline’s execution to the scanner’s exit status, you convert passive vulnerability reporting into an active, automated defensive gate that secures your software supply chain.