Sign up for Continue, connect this sample repo, and watch two checks catch real container security issues on your PRs.
Two Continue checks that run as GitHub status checks on every PR:
-
Dockerfile Review (
.continue/checks/dockerfile-review.md): Catches:latesttags, missingUSERdirectives, hardcoded secrets inARG/ENV,ADDinstead ofCOPY, and missingHEALTHCHECK. Each rule maps to a Docker Scout policy. -
Compose Review (
.continue/checks/compose-review.md): Catches:latesttags in images, missing health checks, missing resource limits,privileged: true, and secrets inenvironment:instead ofsecrets:.
Both checks are already in this repo. You don't need to write them from scratch. The lab walks you through connecting the repo, opening test PRs, and watching the checks work.
A Python/Flask REST API with a production-ready Dockerfile and docker-compose.yml. The test branches contain intentionally problematic container configurations that the checks will catch.
├── src/
│ └── app.py # Flask app with /health endpoint
├── .continue/
│ └── checks/
│ ├── dockerfile-review.md # Check 1: Dockerfile best practices
│ └── compose-review.md # Check 2: Compose production readiness
├── Dockerfile # Production-ready multi-stage build
├── docker-compose.yml # Production-ready compose config
├── requirements.txt # Python dependencies
├── .dockerignore # Build context exclusions
└── .env.example # Environment variable template
- GitHub account
- Go to continue.dev and sign up for Mission Control
- Connect your GitHub account
- Fork this repo to your GitHub account
- In Mission Control, connect the forked repo
Checkpoint: You should see the repo connected in Mission Control with two checks detected.
Open .continue/checks/ in your fork. Two checks are already defined:
dockerfile-review.mdenforces Docker Scout policies at PR time: Up-to-Date Base Images, Default Non-Root User, Approved Base Images, High-Profile Vulnerabilities, and Production Readiness.compose-review.mdenforces production readiness: pinned image tags, health checks, resource limits, no privileged mode, and proper secrets management.
These are plain markdown files in your repo. Version-controlled, reviewable, editable. This is what standards-as-code looks like.
- In your fork, open a PR from
test/bad-dockerfiletomain - Wait for checks to run
- Expected: The Dockerfile Review check flags five issues:
FROM python:latest(Up-to-Date Base Images policy)ARG DATABASE_PASSWORD=changeme(High-Profile Vulnerabilities policy)ENV SECRET_KEY=hardcoded123(High-Profile Vulnerabilities policy)ADD . /app/instead ofCOPY(Advisory patterns)- No
USERdirective (Default Non-Root User policy) - No
HEALTHCHECK(Production readiness)
- Review the suggested fixes and accept them
- Checks go green
What you're seeing: The check caught six issues a human reviewer might or might not have noticed. You reviewed the suggestions and accepted them. This is the "building trust" phase.
- Open a PR from
test/bad-composetomain - Wait for checks
- Expected:
- Compose Review check fails:
nginx:latesttag,privileged: true, secrets inenvironment:block, no health checks on any service, no resource limits - Dockerfile Review check also fails: The branch includes a problematic Dockerfile alongside the compose file
- Compose Review check fails:
- Accept the suggestions
- Checks go green
What you're seeing: Two checks, two different kinds of catches, both running automatically. The Dockerfile check catches build-time issues. The Compose check catches runtime configuration issues.
- Open a PR from
test/clean-upgradetomain - Wait for checks
- Expected: Both checks pass. Green checks. No action needed.
What you're seeing: This is what most of your PRs will look like once the checks are running. Green. Handled. You move on.
Open .continue/checks/dockerfile-review.md in your fork and add a rule. Ideas:
- Require multi-stage builds for production Dockerfiles
- Warn on non-slim/non-alpine base images
- Require
LABELinstructions for image metadata - Recommend Docker Hardened Images (
docker/pythoninstead ofpython)
Commit the change, open a test PR, and verify the check catches the new pattern.
What you're seeing: These checks are yours to customize. The rules you enforce are whatever matters to your team. Adding a rule is adding a paragraph to a markdown file.
These checks form a pre-build layer. Docker Scout forms the post-build layer:
| Continue Checks | Docker Scout | |
|---|---|---|
| When | PR time (pre-build) | Post-build |
| What | Dockerfile syntax, compose config | Built image contents, CVEs |
| Catches | Policy violations in code | Vulnerabilities in packages |
Issues caught at PR time never become images. Issues that slip through get caught by Scout before deployment.
By the end of this lab you have:
- Two container security checks running on your repo as GitHub status checks
- Seen them handle three scenarios (two catches, one clean pass)
- Optionally customized one with a rule from your own codebase
From here, every PR on your repo gets checked automatically.
Next step: Add .continue/checks/ to your real repo and write checks for the patterns your team actually cares about.