Initial commit
This commit is contained in:
12
.claude-plugin/plugin.json
Normal file
12
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "docker-validation",
|
||||||
|
"description": "Comprehensive Docker and Docker Compose validation following best practices and security standards. Validates Dockerfiles, multi-stage builds, modern Compose syntax, and generates automation scripts",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"author": {
|
||||||
|
"name": "rknall",
|
||||||
|
"email": "zhongweili@tubi.tv"
|
||||||
|
},
|
||||||
|
"skills": [
|
||||||
|
"./"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# docker-validation
|
||||||
|
|
||||||
|
Comprehensive Docker and Docker Compose validation following best practices and security standards. Validates Dockerfiles, multi-stage builds, modern Compose syntax, and generates automation scripts
|
||||||
758
SKILL.md
Normal file
758
SKILL.md
Normal file
@@ -0,0 +1,758 @@
|
|||||||
|
---
|
||||||
|
name: "Docker Configuration Validator"
|
||||||
|
description: "Comprehensive Docker and Docker Compose validation following best practices and security standards. Use this skill when users ask to validate Dockerfiles, review Docker configurations, check Docker Compose files, verify multi-stage builds, audit Docker security, or ensure compliance with Docker best practices. Validates syntax, security, multi-stage builds, and modern Docker Compose requirements."
|
||||||
|
---
|
||||||
|
|
||||||
|
# Docker Configuration Validator
|
||||||
|
|
||||||
|
This skill provides comprehensive validation for Dockerfiles and Docker Compose files, ensuring compliance with best practices, security standards, and modern syntax requirements.
|
||||||
|
|
||||||
|
## When to Use This Skill
|
||||||
|
|
||||||
|
Activate this skill when the user requests:
|
||||||
|
- Validate Dockerfiles or Docker Compose files
|
||||||
|
- Review Docker configurations for best practices
|
||||||
|
- Check for Docker security issues
|
||||||
|
- Verify multi-stage build implementation
|
||||||
|
- Audit Docker setup for production readiness
|
||||||
|
- Ensure modern Docker Compose syntax compliance
|
||||||
|
- Fix Docker configuration issues
|
||||||
|
- Create validation scripts or CI/CD integration
|
||||||
|
|
||||||
|
## Core Workflow
|
||||||
|
|
||||||
|
### Phase 1: Initial Assessment
|
||||||
|
|
||||||
|
When a user requests Docker validation, start by understanding the scope:
|
||||||
|
|
||||||
|
1. **Identify What to Validate**
|
||||||
|
- Single Dockerfile or multiple?
|
||||||
|
- Docker Compose file(s)?
|
||||||
|
- Entire project directory?
|
||||||
|
- Specific concerns or focus areas?
|
||||||
|
- Production vs development environment?
|
||||||
|
|
||||||
|
2. **Understand Requirements**
|
||||||
|
- Security compliance level needed?
|
||||||
|
- Multi-stage build requirement?
|
||||||
|
- Performance constraints?
|
||||||
|
- CI/CD integration needed?
|
||||||
|
- Automated validation script desired?
|
||||||
|
|
||||||
|
3. **Check Available Tools**
|
||||||
|
- Is Hadolint available? (Dockerfile linter)
|
||||||
|
- Is DCLint available? (Docker Compose linter)
|
||||||
|
- Is Docker CLI available?
|
||||||
|
- Should tools be installed as part of process?
|
||||||
|
|
||||||
|
### Phase 2: Dockerfile Validation
|
||||||
|
|
||||||
|
#### Step 1: Locate Dockerfiles
|
||||||
|
|
||||||
|
Find all Dockerfiles in the project:
|
||||||
|
```bash
|
||||||
|
find . -type f \( -name "Dockerfile*" ! -name "*.md" \)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 2: Run Hadolint Validation
|
||||||
|
|
||||||
|
**If Hadolint is available:**
|
||||||
|
```bash
|
||||||
|
# Validate each Dockerfile
|
||||||
|
hadolint Dockerfile
|
||||||
|
|
||||||
|
# JSON output for programmatic analysis
|
||||||
|
hadolint --format json Dockerfile
|
||||||
|
|
||||||
|
# Set failure threshold
|
||||||
|
hadolint --failure-threshold error Dockerfile
|
||||||
|
```
|
||||||
|
|
||||||
|
**If Hadolint is NOT available:**
|
||||||
|
- Perform manual validation using built-in checks (see Step 3)
|
||||||
|
- Recommend Hadolint installation
|
||||||
|
- Provide installation instructions
|
||||||
|
|
||||||
|
#### Step 3: Manual Dockerfile Validation
|
||||||
|
|
||||||
|
Check each Dockerfile for critical issues:
|
||||||
|
|
||||||
|
**1. Base Image Best Practices**
|
||||||
|
- ✅ Check: No `:latest` tags
|
||||||
|
- ✅ Check: Specific version pinned
|
||||||
|
- ✅ Check: Uses minimal base images (alpine/slim variants)
|
||||||
|
- ✅ Check: Trusted registry used
|
||||||
|
|
||||||
|
**2. Multi-Stage Build Verification**
|
||||||
|
```bash
|
||||||
|
# Count FROM statements (should be >= 2 for multi-stage)
|
||||||
|
FROM_COUNT=$(grep -c "^FROM " Dockerfile)
|
||||||
|
|
||||||
|
# Check for named stages
|
||||||
|
NAMED_STAGES=$(grep -c "^FROM .* AS " Dockerfile)
|
||||||
|
|
||||||
|
# Check for inter-stage copies
|
||||||
|
COPY_FROM=$(grep -c "COPY --from=" Dockerfile)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Analysis:**
|
||||||
|
- If FROM_COUNT >= 2: Multi-stage build detected ✅
|
||||||
|
- If COPY_FROM == 0 and FROM_COUNT >= 2: Warning - artifacts may not be transferred
|
||||||
|
- If FROM_COUNT == 1: Single-stage build - recommend multi-stage for optimization
|
||||||
|
|
||||||
|
**3. Security Checks**
|
||||||
|
- ✅ Check: USER directive present (non-root)
|
||||||
|
- ✅ Check: Last USER is not root
|
||||||
|
- ✅ Check: No secrets in Dockerfile
|
||||||
|
- ✅ Check: WORKDIR uses absolute paths
|
||||||
|
- ✅ Check: No unnecessary privileges
|
||||||
|
|
||||||
|
**4. Layer Optimization**
|
||||||
|
- ✅ Check: Combined RUN commands
|
||||||
|
- ✅ Check: Package manager cache cleaned
|
||||||
|
- ✅ Check: COPY before RUN for better caching
|
||||||
|
- ✅ Check: .dockerignore file exists
|
||||||
|
|
||||||
|
**5. Best Practices**
|
||||||
|
- ✅ Check: HEALTHCHECK defined
|
||||||
|
- ✅ Check: WORKDIR used (not cd)
|
||||||
|
- ✅ Check: COPY preferred over ADD
|
||||||
|
- ✅ Check: CMD/ENTRYPOINT uses JSON notation
|
||||||
|
- ✅ Check: Labels included (maintainer, version)
|
||||||
|
|
||||||
|
#### Step 4: Dockerfile Issue Classification
|
||||||
|
|
||||||
|
Classify findings by severity:
|
||||||
|
|
||||||
|
**CRITICAL (Must Fix):**
|
||||||
|
- Running as root user
|
||||||
|
- Using `:latest` tags
|
||||||
|
- Secrets exposed in image
|
||||||
|
- Invalid syntax
|
||||||
|
|
||||||
|
**HIGH (Should Fix):**
|
||||||
|
- No multi-stage build when applicable
|
||||||
|
- No HEALTHCHECK
|
||||||
|
- Package versions not pinned
|
||||||
|
- Security vulnerabilities
|
||||||
|
|
||||||
|
**MEDIUM (Recommended):**
|
||||||
|
- Using ADD instead of COPY
|
||||||
|
- Not cleaning package cache
|
||||||
|
- Missing labels
|
||||||
|
- Inefficient layer structure
|
||||||
|
|
||||||
|
**LOW (Nice to Have):**
|
||||||
|
- Could use slimmer base image
|
||||||
|
- Could combine more RUN commands
|
||||||
|
- Could improve comments
|
||||||
|
|
||||||
|
### Phase 3: Docker Compose Validation
|
||||||
|
|
||||||
|
#### Step 1: Locate Compose Files
|
||||||
|
|
||||||
|
Find all Docker Compose files:
|
||||||
|
```bash
|
||||||
|
find . -maxdepth 3 -type f \( -name "docker-compose*.yml" -o -name "docker-compose*.yaml" -o -name "compose*.yml" \)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 2: Check for Obsolete Version Field
|
||||||
|
|
||||||
|
**CRITICAL CHECK:** Modern Docker Compose (v2.27.0+) does NOT use version field
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check for obsolete version field
|
||||||
|
if grep -q "^version:" docker-compose.yml; then
|
||||||
|
echo "❌ ERROR: Found obsolete 'version' field"
|
||||||
|
echo "Remove 'version:' line - it's obsolete in Compose v2.27.0+"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
**Old (Deprecated):**
|
||||||
|
```yaml
|
||||||
|
version: '3.8' # ❌ REMOVE THIS
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: nginx:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
**New (Modern):**
|
||||||
|
```yaml
|
||||||
|
# No version field!
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: nginx:1.24-alpine
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 3: Built-in Docker Compose Validation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Syntax validation
|
||||||
|
docker compose config --quiet
|
||||||
|
|
||||||
|
# Show resolved configuration
|
||||||
|
docker compose config
|
||||||
|
|
||||||
|
# Validate specific file
|
||||||
|
docker compose -f docker-compose.prod.yml config --quiet
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 4: DCLint Validation (if available)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Lint compose file
|
||||||
|
dclint docker-compose.yml
|
||||||
|
|
||||||
|
# Auto-fix issues
|
||||||
|
dclint --fix docker-compose.yml
|
||||||
|
|
||||||
|
# JSON output
|
||||||
|
dclint --format json docker-compose.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 5: Manual Compose Validation
|
||||||
|
|
||||||
|
**1. Image Best Practices**
|
||||||
|
- ✅ Check: No `:latest` tags
|
||||||
|
- ✅ Check: Specific versions specified
|
||||||
|
- ✅ Check: Images from trusted sources
|
||||||
|
|
||||||
|
**2. Service Configuration**
|
||||||
|
- ✅ Check: Restart policies defined
|
||||||
|
- ✅ Check: Health checks configured
|
||||||
|
- ✅ Check: Resource limits set (optional but recommended)
|
||||||
|
- ✅ Check: Proper service dependencies (depends_on)
|
||||||
|
|
||||||
|
**3. Networking**
|
||||||
|
- ✅ Check: Custom networks defined
|
||||||
|
- ✅ Check: Network isolation implemented
|
||||||
|
- ✅ Check: Appropriate network drivers used
|
||||||
|
|
||||||
|
**4. Volumes & Persistence**
|
||||||
|
- ✅ Check: Named volumes for persistence
|
||||||
|
- ✅ Check: Volume drivers specified
|
||||||
|
- ✅ Check: Bind mounts use absolute paths
|
||||||
|
- ✅ Check: No sensitive data in volumes
|
||||||
|
|
||||||
|
**5. Environment & Secrets**
|
||||||
|
- ✅ Check: Environment variables properly managed
|
||||||
|
- ✅ Check: No hardcoded secrets
|
||||||
|
- ✅ Check: .env file usage recommended
|
||||||
|
- ✅ Check: Secrets management configured
|
||||||
|
|
||||||
|
**6. Security**
|
||||||
|
- ✅ Check: No privileged mode (unless necessary)
|
||||||
|
- ✅ Check: Capabilities properly configured
|
||||||
|
- ✅ Check: User/group specified
|
||||||
|
- ✅ Check: Read-only root filesystem (where applicable)
|
||||||
|
|
||||||
|
### Phase 4: Multi-Stage Build Deep Dive
|
||||||
|
|
||||||
|
When validating multi-stage builds, ensure:
|
||||||
|
|
||||||
|
**1. Stage Structure**
|
||||||
|
```dockerfile
|
||||||
|
# Build stage
|
||||||
|
FROM node:20-bullseye AS builder
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm ci
|
||||||
|
COPY . .
|
||||||
|
RUN npm run build && npm run test
|
||||||
|
|
||||||
|
# Production stage
|
||||||
|
FROM node:20-alpine AS runtime
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=builder /app/dist ./dist
|
||||||
|
USER node
|
||||||
|
CMD ["node", "dist/index.js"]
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. Validation Checklist**
|
||||||
|
- ✅ At least 2 stages (build + runtime)
|
||||||
|
- ✅ All stages are named with AS keyword
|
||||||
|
- ✅ Artifacts copied between stages using COPY --from
|
||||||
|
- ✅ Final stage uses minimal base image
|
||||||
|
- ✅ Build tools NOT in final stage
|
||||||
|
- ✅ Only necessary files in final image
|
||||||
|
- ✅ Final stage runs as non-root user
|
||||||
|
|
||||||
|
**3. Common Patterns to Check**
|
||||||
|
|
||||||
|
**Node.js Multi-Stage:**
|
||||||
|
- Build stage: Install all deps, build, test
|
||||||
|
- Runtime stage: Production deps only, built artifacts
|
||||||
|
|
||||||
|
**Python Multi-Stage:**
|
||||||
|
- Build stage: Compile dependencies, build wheels
|
||||||
|
- Runtime stage: Install pre-built wheels, app only
|
||||||
|
|
||||||
|
**Go Multi-Stage:**
|
||||||
|
- Build stage: Full Go toolchain, compile binary
|
||||||
|
- Runtime stage: Scratch/distroless, binary only
|
||||||
|
|
||||||
|
### Phase 5: Security Audit
|
||||||
|
|
||||||
|
Perform comprehensive security checks:
|
||||||
|
|
||||||
|
**1. User & Permissions**
|
||||||
|
```bash
|
||||||
|
# Check for USER directive
|
||||||
|
USER_COUNT=$(grep -c "^USER " Dockerfile)
|
||||||
|
LAST_USER=$(grep "^USER " Dockerfile | tail -1 | awk '{print $2}')
|
||||||
|
|
||||||
|
if [ "$USER_COUNT" -eq 0 ]; then
|
||||||
|
echo "❌ CRITICAL: No USER specified (runs as root!)"
|
||||||
|
elif [ "$LAST_USER" == "root" ] || [ "$LAST_USER" == "0" ]; then
|
||||||
|
echo "❌ CRITICAL: Final USER is root"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. Exposed Secrets**
|
||||||
|
- Check for passwords in ENV
|
||||||
|
- Check for API keys in COPY/ADD
|
||||||
|
- Check for credentials in RUN commands
|
||||||
|
- Recommend secrets management solutions
|
||||||
|
|
||||||
|
**3. Vulnerable Base Images**
|
||||||
|
- Check base image age and support status
|
||||||
|
- Recommend security scanning (Trivy, Snyk)
|
||||||
|
- Suggest pinned, supported versions
|
||||||
|
|
||||||
|
**4. Network Exposure**
|
||||||
|
- Review EXPOSE directives
|
||||||
|
- Check if unnecessary ports exposed
|
||||||
|
- Validate port mappings in Compose
|
||||||
|
|
||||||
|
### Phase 6: Generate Validation Report
|
||||||
|
|
||||||
|
Structure the validation report:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Docker Configuration Validation Report
|
||||||
|
|
||||||
|
## Executive Summary
|
||||||
|
- **Total Dockerfiles Analyzed**: X
|
||||||
|
- **Total Compose Files Analyzed**: X
|
||||||
|
- **Critical Issues**: X
|
||||||
|
- **High Priority Issues**: X
|
||||||
|
- **Medium Priority Issues**: X
|
||||||
|
- **Low Priority Issues**: X
|
||||||
|
- **Overall Status**: ✅ PASS / ⚠️ WARNINGS / ❌ FAIL
|
||||||
|
|
||||||
|
## Dockerfile Analysis
|
||||||
|
|
||||||
|
### [Dockerfile Path]
|
||||||
|
|
||||||
|
#### Validation Results
|
||||||
|
✅ **PASSED**: Multi-stage build implemented
|
||||||
|
✅ **PASSED**: Running as non-root user
|
||||||
|
⚠️ **WARNING**: Using ADD instead of COPY (line 15)
|
||||||
|
❌ **FAILED**: Base image uses :latest tag (line 1)
|
||||||
|
|
||||||
|
#### Security Assessment
|
||||||
|
- **User**: nodejs (non-root) ✅
|
||||||
|
- **Base Image**: node:latest ❌
|
||||||
|
- **Secrets**: None detected ✅
|
||||||
|
- **Health Check**: Present ✅
|
||||||
|
|
||||||
|
#### Multi-Stage Build Analysis
|
||||||
|
- **Stages**: 2 (builder, runtime)
|
||||||
|
- **Named Stages**: Yes ✅
|
||||||
|
- **Inter-Stage Copies**: 1 ✅
|
||||||
|
- **Final Base**: node:20-alpine ✅
|
||||||
|
- **Build Tools in Final**: No ✅
|
||||||
|
|
||||||
|
#### Issues Found
|
||||||
|
|
||||||
|
**CRITICAL:**
|
||||||
|
1. Line 1: Using :latest tag
|
||||||
|
- Issue: `FROM node:latest`
|
||||||
|
- Fix: `FROM node:20-bullseye`
|
||||||
|
- Impact: Unpredictable builds, security risk
|
||||||
|
|
||||||
|
**HIGH:**
|
||||||
|
2. Line 45: Package cache not cleaned
|
||||||
|
- Issue: `RUN apt-get install -y curl`
|
||||||
|
- Fix: Add `&& rm -rf /var/lib/apt/lists/*`
|
||||||
|
- Impact: Larger image size
|
||||||
|
|
||||||
|
**MEDIUM:**
|
||||||
|
3. Line 15: Using ADD instead of COPY
|
||||||
|
- Issue: `ADD app.tar.gz /app/`
|
||||||
|
- Fix: `COPY app.tar.gz /app/` (or extract separately)
|
||||||
|
- Impact: Less explicit behavior
|
||||||
|
|
||||||
|
## Docker Compose Analysis
|
||||||
|
|
||||||
|
### [Compose File Path]
|
||||||
|
|
||||||
|
#### Validation Results
|
||||||
|
❌ **FAILED**: Obsolete 'version' field present
|
||||||
|
⚠️ **WARNING**: 3 services using :latest tags
|
||||||
|
✅ **PASSED**: Custom networks defined
|
||||||
|
✅ **PASSED**: Named volumes configured
|
||||||
|
|
||||||
|
#### Modern Syntax Compliance
|
||||||
|
- **Version Field**: Present ❌ (MUST REMOVE)
|
||||||
|
- **Specific Tags**: 2 of 5 services ⚠️
|
||||||
|
- **Restart Policies**: All services ✅
|
||||||
|
- **Health Checks**: 3 of 5 services ⚠️
|
||||||
|
|
||||||
|
#### Issues Found
|
||||||
|
|
||||||
|
**CRITICAL:**
|
||||||
|
1. Obsolete 'version' field
|
||||||
|
- Issue: `version: '3.8'`
|
||||||
|
- Fix: Remove the entire line
|
||||||
|
- Impact: Using deprecated syntax
|
||||||
|
|
||||||
|
**HIGH:**
|
||||||
|
2. Service 'web' uses :latest tag
|
||||||
|
- Issue: `image: nginx:latest`
|
||||||
|
- Fix: `image: nginx:1.24-alpine`
|
||||||
|
- Impact: Unpredictable deployments
|
||||||
|
|
||||||
|
3. No restart policy on 'cache' service
|
||||||
|
- Issue: Missing `restart:` directive
|
||||||
|
- Fix: Add `restart: unless-stopped`
|
||||||
|
- Impact: Service won't auto-recover
|
||||||
|
|
||||||
|
## Recommendations
|
||||||
|
|
||||||
|
### Immediate Actions (Critical)
|
||||||
|
1. Pin all Docker image versions (remove :latest)
|
||||||
|
2. Remove obsolete 'version' field from Compose files
|
||||||
|
3. Ensure all services run as non-root users
|
||||||
|
4. Clean package manager caches in all Dockerfiles
|
||||||
|
|
||||||
|
### High Priority (Before Production)
|
||||||
|
1. Implement health checks for all services
|
||||||
|
2. Add restart policies to all Compose services
|
||||||
|
3. Set up resource limits (memory, CPU)
|
||||||
|
4. Implement proper secrets management
|
||||||
|
|
||||||
|
### Medium Priority (Best Practices)
|
||||||
|
1. Use COPY instead of ADD unless extracting archives
|
||||||
|
2. Add labels for better organization
|
||||||
|
3. Implement logging drivers
|
||||||
|
4. Add metadata to images
|
||||||
|
|
||||||
|
### Low Priority (Optimizations)
|
||||||
|
1. Consider slimmer base images where possible
|
||||||
|
2. Optimize layer caching with better ordering
|
||||||
|
3. Add comprehensive comments
|
||||||
|
4. Implement .dockerignore files
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
1. **Fix Critical Issues** (Estimated: 30 minutes)
|
||||||
|
- Pin image versions
|
||||||
|
- Remove version field from Compose
|
||||||
|
- Add USER directives
|
||||||
|
|
||||||
|
2. **Address High Priority** (Estimated: 1-2 hours)
|
||||||
|
- Add health checks
|
||||||
|
- Configure restart policies
|
||||||
|
- Set resource limits
|
||||||
|
|
||||||
|
3. **Re-validate** (Estimated: 10 minutes)
|
||||||
|
- Run validation again after fixes
|
||||||
|
- Ensure all critical issues resolved
|
||||||
|
|
||||||
|
4. **Set Up Automation** (Estimated: 1 hour)
|
||||||
|
- Add pre-commit hooks
|
||||||
|
- Integrate into CI/CD
|
||||||
|
- Schedule regular security scans
|
||||||
|
|
||||||
|
## Validation Tools Recommendations
|
||||||
|
|
||||||
|
### Install Required Tools
|
||||||
|
```bash
|
||||||
|
# Hadolint (Dockerfile linter)
|
||||||
|
brew install hadolint # macOS
|
||||||
|
# or
|
||||||
|
wget -O /usr/local/bin/hadolint https://github.com/hadolint/hadolint/releases/download/v2.12.0/hadolint-Linux-x86_64
|
||||||
|
|
||||||
|
# DCLint (Docker Compose linter)
|
||||||
|
npm install -g docker-compose-linter
|
||||||
|
|
||||||
|
# Trivy (Security scanner)
|
||||||
|
brew install aquasecurity/trivy/trivy
|
||||||
|
```
|
||||||
|
|
||||||
|
### Automated Validation Script
|
||||||
|
[Provide custom validation script based on project needs]
|
||||||
|
|
||||||
|
### CI/CD Integration
|
||||||
|
[Provide GitHub Actions / GitLab CI configuration]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deliverables
|
||||||
|
|
||||||
|
At the end of validation, provide:
|
||||||
|
|
||||||
|
1. **Comprehensive Validation Report**
|
||||||
|
- Executive summary with overall status
|
||||||
|
- Detailed findings per file
|
||||||
|
- Issue classification (Critical → Low)
|
||||||
|
- Specific fixes for each issue
|
||||||
|
- Recommendations prioritized
|
||||||
|
|
||||||
|
2. **Fixed Configuration Files** (if requested)
|
||||||
|
- Corrected Dockerfiles
|
||||||
|
- Updated Compose files
|
||||||
|
- .hadolint.yaml configuration
|
||||||
|
- .dclintrc.json configuration
|
||||||
|
|
||||||
|
3. **Validation Script** (if requested)
|
||||||
|
- Custom bash script for automated validation
|
||||||
|
- Checks for project-specific requirements
|
||||||
|
- Color-coded output
|
||||||
|
- Exit codes for CI/CD
|
||||||
|
|
||||||
|
4. **CI/CD Integration** (if requested)
|
||||||
|
- GitHub Actions workflow
|
||||||
|
- GitLab CI configuration
|
||||||
|
- Pre-commit hooks
|
||||||
|
- Integration with existing pipeline
|
||||||
|
|
||||||
|
5. **Documentation**
|
||||||
|
- How to run validation locally
|
||||||
|
- Tool installation instructions
|
||||||
|
- Best practices guide
|
||||||
|
- Common issues and solutions
|
||||||
|
|
||||||
|
## Validation Script Template
|
||||||
|
|
||||||
|
When user requests automated validation, create this script:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# docker-validation.sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Color codes
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
ERRORS=0
|
||||||
|
WARNINGS=0
|
||||||
|
|
||||||
|
echo -e "${BLUE}╔══════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${BLUE}║ Docker Configuration Validator ║${NC}"
|
||||||
|
echo -e "${BLUE}╚══════════════════════════════════════════╝${NC}"
|
||||||
|
|
||||||
|
# 1. Prerequisites check
|
||||||
|
echo -e "\n${BLUE}━━━ Checking Prerequisites ━━━${NC}"
|
||||||
|
command -v docker >/dev/null || { echo "❌ Docker not found"; exit 1; }
|
||||||
|
command -v hadolint >/dev/null || echo "⚠️ Hadolint not installed"
|
||||||
|
|
||||||
|
# 2. Dockerfile validation
|
||||||
|
echo -e "\n${BLUE}━━━ Validating Dockerfiles ━━━${NC}"
|
||||||
|
find . -name "Dockerfile*" -type f | while read df; do
|
||||||
|
echo "Checking: $df"
|
||||||
|
# [Validation logic here]
|
||||||
|
done
|
||||||
|
|
||||||
|
# 3. Multi-stage build check
|
||||||
|
echo -e "\n${BLUE}━━━ Checking Multi-Stage Builds ━━━${NC}"
|
||||||
|
# [Multi-stage validation logic]
|
||||||
|
|
||||||
|
# 4. Compose validation
|
||||||
|
echo -e "\n${BLUE}━━━ Validating Docker Compose ━━━${NC}"
|
||||||
|
find . -name "*compose*.yml" | while read cf; do
|
||||||
|
# Check for obsolete version field
|
||||||
|
if grep -q "^version:" "$cf"; then
|
||||||
|
echo -e "${RED}❌ $cf: Obsolete version field${NC}"
|
||||||
|
ERRORS=$((ERRORS + 1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Validate syntax
|
||||||
|
docker compose -f "$cf" config --quiet || ERRORS=$((ERRORS + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
# 5. Security checks
|
||||||
|
echo -e "\n${BLUE}━━━ Security Audit ━━━${NC}"
|
||||||
|
# [Security validation logic]
|
||||||
|
|
||||||
|
# Final report
|
||||||
|
echo -e "\n${BLUE}╔══════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${BLUE}║ Validation Summary ║${NC}"
|
||||||
|
echo -e "${BLUE}╚══════════════════════════════════════════╝${NC}"
|
||||||
|
|
||||||
|
if [ $ERRORS -eq 0 ]; then
|
||||||
|
echo -e "${GREEN}✅ All checks passed!${NC}"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo -e "${RED}❌ Found $ERRORS error(s), $WARNINGS warning(s)${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
## CI/CD Integration Templates
|
||||||
|
|
||||||
|
### GitHub Actions
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: Docker Validation
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, develop ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
validate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Lint Dockerfiles
|
||||||
|
uses: hadolint/hadolint-action@v3.1.0
|
||||||
|
with:
|
||||||
|
dockerfile: ./Dockerfile
|
||||||
|
failure-threshold: error
|
||||||
|
|
||||||
|
- name: Validate Compose files
|
||||||
|
run: |
|
||||||
|
for f in $(find . -name "*compose*.yml"); do
|
||||||
|
docker compose -f "$f" config --quiet
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: Check for obsolete version field
|
||||||
|
run: |
|
||||||
|
if grep -r "^version:" . --include="*compose*.yml"; then
|
||||||
|
echo "ERROR: Found obsolete version field"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
### GitLab CI
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
stages:
|
||||||
|
- validate
|
||||||
|
|
||||||
|
docker-validation:
|
||||||
|
stage: validate
|
||||||
|
image: hadolint/hadolint:latest-debian
|
||||||
|
script:
|
||||||
|
- find . -name "Dockerfile*" -exec hadolint {} \;
|
||||||
|
- |
|
||||||
|
for f in $(find . -name "*compose*.yml"); do
|
||||||
|
if grep -q "^version:" "$f"; then
|
||||||
|
echo "ERROR: Obsolete version field in $f"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
## Communication Style
|
||||||
|
|
||||||
|
When conducting validation:
|
||||||
|
|
||||||
|
1. **Be Thorough**
|
||||||
|
- Check all aspects systematically
|
||||||
|
- Don't skip manual checks if tools unavailable
|
||||||
|
- Validate both syntax and best practices
|
||||||
|
|
||||||
|
2. **Prioritize Clearly**
|
||||||
|
- Critical issues first (security, functionality)
|
||||||
|
- High priority next (production readiness)
|
||||||
|
- Medium and low as improvements
|
||||||
|
|
||||||
|
3. **Provide Specific Fixes**
|
||||||
|
- Show exact line numbers
|
||||||
|
- Provide before/after code
|
||||||
|
- Explain why the fix is needed
|
||||||
|
- Include impact assessment
|
||||||
|
|
||||||
|
4. **Educate**
|
||||||
|
- Explain Docker best practices
|
||||||
|
- Reference official documentation
|
||||||
|
- Provide learning resources
|
||||||
|
- Share modern syntax requirements
|
||||||
|
|
||||||
|
5. **Be Actionable**
|
||||||
|
- Give step-by-step remediation
|
||||||
|
- Provide automation scripts
|
||||||
|
- Suggest CI/CD integration
|
||||||
|
- Estimate effort for fixes
|
||||||
|
|
||||||
|
## Common Validation Patterns
|
||||||
|
|
||||||
|
### Pattern 1: Quick Syntax Check
|
||||||
|
- Run Hadolint and DCLint
|
||||||
|
- Check for obsolete version field
|
||||||
|
- Validate with Docker Compose config
|
||||||
|
- Report critical syntax errors only
|
||||||
|
|
||||||
|
### Pattern 2: Full Production Audit
|
||||||
|
- Complete Dockerfile validation
|
||||||
|
- Multi-stage build verification
|
||||||
|
- Security audit
|
||||||
|
- Compose best practices
|
||||||
|
- Generate comprehensive report
|
||||||
|
- Provide automation scripts
|
||||||
|
|
||||||
|
### Pattern 3: Security-Focused Review
|
||||||
|
- User privilege checks
|
||||||
|
- Secret exposure scan
|
||||||
|
- Base image security
|
||||||
|
- Network exposure audit
|
||||||
|
- Security scanning integration
|
||||||
|
|
||||||
|
### Pattern 4: Optimization Review
|
||||||
|
- Multi-stage build effectiveness
|
||||||
|
- Layer optimization
|
||||||
|
- Image size analysis
|
||||||
|
- Build time improvements
|
||||||
|
- Caching strategies
|
||||||
|
|
||||||
|
## Key Rules to Enforce
|
||||||
|
|
||||||
|
### Dockerfile Rules (Critical)
|
||||||
|
- ✅ No `:latest` tags (DL3006)
|
||||||
|
- ✅ Last USER not root (DL3002)
|
||||||
|
- ✅ Use absolute WORKDIR (DL3000)
|
||||||
|
- ✅ Pin package versions (DL3008, DL3013)
|
||||||
|
- ✅ Clean package cache (DL3009)
|
||||||
|
|
||||||
|
### Docker Compose Rules (Critical)
|
||||||
|
- ✅ NO version field (obsolete since v2.27.0)
|
||||||
|
- ✅ No `:latest` tags
|
||||||
|
- ✅ Restart policies defined
|
||||||
|
- ✅ Health checks configured
|
||||||
|
- ✅ Named volumes for persistence
|
||||||
|
|
||||||
|
### Multi-Stage Build Rules
|
||||||
|
- ✅ Minimum 2 stages
|
||||||
|
- ✅ Named stages with AS
|
||||||
|
- ✅ COPY --from for artifacts
|
||||||
|
- ✅ Minimal final base image
|
||||||
|
- ✅ No build tools in final stage
|
||||||
|
|
||||||
|
### Security Rules (Critical)
|
||||||
|
- ✅ Run as non-root USER
|
||||||
|
- ✅ No secrets in images
|
||||||
|
- ✅ Minimal base images
|
||||||
|
- ✅ Regular security scans
|
||||||
|
- ✅ Least privilege principle
|
||||||
|
|
||||||
|
## Reference Resources
|
||||||
|
|
||||||
|
When providing recommendations, reference:
|
||||||
|
- **Docker Best Practices**: Official Docker documentation
|
||||||
|
- **Hadolint Rules**: Complete rule reference
|
||||||
|
- **Compose Specification**: Latest Compose spec
|
||||||
|
- **Security Standards**: CIS Docker Benchmark
|
||||||
|
- **Multi-Stage Builds**: Official guide and examples
|
||||||
|
|
||||||
|
Remember: Docker validation is about ensuring reliable, secure, and efficient containerized applications. Always prioritize security and production readiness while maintaining developer experience.
|
||||||
53
plugin.lock.json
Normal file
53
plugin.lock.json
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
{
|
||||||
|
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||||
|
"pluginId": "gh:rknall/claude-skills:docker-validation",
|
||||||
|
"normalized": {
|
||||||
|
"repo": null,
|
||||||
|
"ref": "refs/tags/v20251128.0",
|
||||||
|
"commit": "8cc5ec984d23c20300a150de3c87be39b7b6c111",
|
||||||
|
"treeHash": "d2440a839805bddbc3ac76a4c3bcee1d1b0dd48c5bb22652a7e5f58c6745cec0",
|
||||||
|
"generatedAt": "2025-11-28T10:27:58.504775Z",
|
||||||
|
"toolVersion": "publish_plugins.py@0.2.0"
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||||
|
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||||
|
},
|
||||||
|
"manifest": {
|
||||||
|
"name": "docker-validation",
|
||||||
|
"description": "Comprehensive Docker and Docker Compose validation following best practices and security standards. Validates Dockerfiles, multi-stage builds, modern Compose syntax, and generates automation scripts",
|
||||||
|
"version": "1.0.0"
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "tool-installation.md",
|
||||||
|
"sha256": "67320fa4f3da391ca9fa796e7740472afefe860729453d2f88be052f65e3d2d0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "validation-checklist.md",
|
||||||
|
"sha256": "962d618839fe19bf41ff0319bc33de9c240c48c7408aaef59ca09d62da11f648"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "README.md",
|
||||||
|
"sha256": "32fc2ef39ba11b721c5dd41910bb8fc871f9cdd88e864e108e09ee2a783cb479"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "SKILL.md",
|
||||||
|
"sha256": "3d86d2c06e23e6c020b06d0a10b663a1211dba63c12489390724e4e48fdd46b0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": ".claude-plugin/plugin.json",
|
||||||
|
"sha256": "8cf25cd9c9986106a943d40aae9247b2ebbf7ae71ba48bfa726177688fb2e221"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dirSha256": "d2440a839805bddbc3ac76a4c3bcee1d1b0dd48c5bb22652a7e5f58c6745cec0"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"scannedAt": null,
|
||||||
|
"scannerVersion": null,
|
||||||
|
"flags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
534
tool-installation.md
Normal file
534
tool-installation.md
Normal file
@@ -0,0 +1,534 @@
|
|||||||
|
# Docker Validation Tools Installation Guide
|
||||||
|
|
||||||
|
Complete installation instructions for all tools needed for Docker configuration validation.
|
||||||
|
|
||||||
|
## Required Tools
|
||||||
|
|
||||||
|
### 1. Docker & Docker Compose
|
||||||
|
|
||||||
|
#### macOS
|
||||||
|
```bash
|
||||||
|
# Install Docker Desktop (includes Docker and Compose)
|
||||||
|
brew install --cask docker
|
||||||
|
|
||||||
|
# Start Docker Desktop application
|
||||||
|
open -a Docker
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
docker --version
|
||||||
|
docker compose version
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Linux (Ubuntu/Debian)
|
||||||
|
```bash
|
||||||
|
# Install Docker Engine
|
||||||
|
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||||
|
sudo sh get-docker.sh
|
||||||
|
|
||||||
|
# Add user to docker group
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
newgrp docker
|
||||||
|
|
||||||
|
# Install Docker Compose
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install docker-compose-plugin
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
docker --version
|
||||||
|
docker compose version
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Windows
|
||||||
|
```powershell
|
||||||
|
# Install Docker Desktop via Chocolatey
|
||||||
|
choco install docker-desktop
|
||||||
|
|
||||||
|
# Or download from https://www.docker.com/products/docker-desktop
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
docker --version
|
||||||
|
docker compose version
|
||||||
|
```
|
||||||
|
|
||||||
|
**Minimum Versions:**
|
||||||
|
- Docker: 20.10.0+
|
||||||
|
- Docker Compose: v2.27.0+ (for modern syntax support)
|
||||||
|
|
||||||
|
## Validation Tools
|
||||||
|
|
||||||
|
### 2. Hadolint (Dockerfile Linter)
|
||||||
|
|
||||||
|
**Why Hadolint?**
|
||||||
|
- Parses Dockerfile into AST for deep analysis
|
||||||
|
- Integrates ShellCheck for bash validation
|
||||||
|
- Enforces Docker best practices
|
||||||
|
- Highly configurable
|
||||||
|
|
||||||
|
#### macOS
|
||||||
|
```bash
|
||||||
|
# Install via Homebrew (recommended)
|
||||||
|
brew install hadolint
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
hadolint --version
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Linux
|
||||||
|
```bash
|
||||||
|
# Download binary (x86_64)
|
||||||
|
HADOLINT_VERSION=v2.12.0
|
||||||
|
wget -O /usr/local/bin/hadolint \
|
||||||
|
https://github.com/hadolint/hadolint/releases/download/${HADOLINT_VERSION}/hadolint-Linux-x86_64
|
||||||
|
|
||||||
|
# Make executable
|
||||||
|
chmod +x /usr/local/bin/hadolint
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
hadolint --version
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Windows
|
||||||
|
```powershell
|
||||||
|
# Download binary
|
||||||
|
$HADOLINT_VERSION = "v2.12.0"
|
||||||
|
Invoke-WebRequest -Uri "https://github.com/hadolint/hadolint/releases/download/${HADOLINT_VERSION}/hadolint-Windows-x86_64.exe" -OutFile "hadolint.exe"
|
||||||
|
|
||||||
|
# Move to PATH location
|
||||||
|
Move-Item hadolint.exe C:\Windows\System32\hadolint.exe
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
hadolint --version
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Using Docker (Cross-platform)
|
||||||
|
```bash
|
||||||
|
# Run Hadolint in container
|
||||||
|
docker run --rm -i hadolint/hadolint:latest < Dockerfile
|
||||||
|
|
||||||
|
# Create alias for convenience
|
||||||
|
echo 'alias hadolint="docker run --rm -i hadolint/hadolint:latest"' >> ~/.bashrc
|
||||||
|
source ~/.bashrc
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
hadolint --version
|
||||||
|
```
|
||||||
|
|
||||||
|
#### VS Code Integration
|
||||||
|
```bash
|
||||||
|
# Install VS Code extension
|
||||||
|
code --install-extension exiasr.hadolint
|
||||||
|
|
||||||
|
# Extension will automatically use hadolint if installed
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. DCLint (Docker Compose Linter)
|
||||||
|
|
||||||
|
**Why DCLint?**
|
||||||
|
- Validates Docker Compose syntax
|
||||||
|
- Enforces best practices
|
||||||
|
- Checks for obsolete version field
|
||||||
|
- Auto-fix capabilities
|
||||||
|
|
||||||
|
#### Prerequisites
|
||||||
|
```bash
|
||||||
|
# Requires Node.js 20.19.0+
|
||||||
|
node --version
|
||||||
|
|
||||||
|
# If not installed:
|
||||||
|
# macOS
|
||||||
|
brew install node
|
||||||
|
|
||||||
|
# Linux (Ubuntu/Debian)
|
||||||
|
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
|
||||||
|
sudo apt-get install -y nodejs
|
||||||
|
|
||||||
|
# Windows
|
||||||
|
choco install nodejs
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Installation
|
||||||
|
```bash
|
||||||
|
# Install globally via npm (recommended)
|
||||||
|
npm install -g docker-compose-linter
|
||||||
|
|
||||||
|
# Or install locally in project
|
||||||
|
npm install --save-dev docker-compose-linter
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
dclint --version
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Using npx (No Installation)
|
||||||
|
```bash
|
||||||
|
# Run without global install
|
||||||
|
npx dclint docker-compose.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Trivy (Security Scanner)
|
||||||
|
|
||||||
|
**Why Trivy?**
|
||||||
|
- Comprehensive vulnerability scanner
|
||||||
|
- Scans images, filesystems, and configs
|
||||||
|
- Free and open-source
|
||||||
|
- Fast and easy to use
|
||||||
|
|
||||||
|
#### macOS
|
||||||
|
```bash
|
||||||
|
# Install via Homebrew
|
||||||
|
brew install aquasecurity/trivy/trivy
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
trivy --version
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Linux (Debian/Ubuntu)
|
||||||
|
```bash
|
||||||
|
# Add repository
|
||||||
|
sudo apt-get install wget gnupg
|
||||||
|
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null
|
||||||
|
echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
|
||||||
|
|
||||||
|
# Install
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install trivy
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
trivy --version
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Using Docker
|
||||||
|
```bash
|
||||||
|
# Run Trivy in container
|
||||||
|
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy:latest image nginx:latest
|
||||||
|
|
||||||
|
# Scan Dockerfile
|
||||||
|
docker run --rm -v $(pwd):/app aquasec/trivy:latest config /app/Dockerfile
|
||||||
|
```
|
||||||
|
|
||||||
|
## Optional But Recommended Tools
|
||||||
|
|
||||||
|
### 5. Dive (Image Layer Analyzer)
|
||||||
|
|
||||||
|
Analyzes Docker image layers to optimize size.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# macOS
|
||||||
|
brew install dive
|
||||||
|
|
||||||
|
# Linux
|
||||||
|
wget https://github.com/wagoodman/dive/releases/download/v0.11.0/dive_0.11.0_linux_amd64.deb
|
||||||
|
sudo apt install ./dive_0.11.0_linux_amd64.deb
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
dive nginx:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Docker Bench Security
|
||||||
|
|
||||||
|
Automated security audit for Docker deployments.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run security audit
|
||||||
|
docker run --rm --net host --pid host --userns host --cap-add audit_control \
|
||||||
|
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
|
||||||
|
-v /etc:/etc:ro \
|
||||||
|
-v /usr/bin/containerd:/usr/bin/containerd:ro \
|
||||||
|
-v /usr/bin/runc:/usr/bin/runc:ro \
|
||||||
|
-v /usr/lib/systemd:/usr/lib/systemd:ro \
|
||||||
|
-v /var/lib:/var/lib:ro \
|
||||||
|
-v /var/run/docker.sock:/var/run/docker.sock:ro \
|
||||||
|
--label docker_bench_security \
|
||||||
|
docker/docker-bench-security
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7. Snyk (Alternative Security Scanner)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install Snyk CLI
|
||||||
|
npm install -g snyk
|
||||||
|
|
||||||
|
# Authenticate
|
||||||
|
snyk auth
|
||||||
|
|
||||||
|
# Test Dockerfile
|
||||||
|
snyk container test nginx:latest
|
||||||
|
|
||||||
|
# Test Docker image
|
||||||
|
snyk container test myapp:latest --file=Dockerfile
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration Files Setup
|
||||||
|
|
||||||
|
### Create .hadolint.yaml
|
||||||
|
```bash
|
||||||
|
cat > .hadolint.yaml << 'EOF'
|
||||||
|
---
|
||||||
|
ignored:
|
||||||
|
- DL3008 # Pin versions in apt-get (sometimes too strict)
|
||||||
|
- DL3013 # Pin versions in pip
|
||||||
|
- DL3018 # Pin versions in apk
|
||||||
|
|
||||||
|
override:
|
||||||
|
error:
|
||||||
|
- DL3002 # Last user should not be root
|
||||||
|
- DL3020 # Use COPY instead of ADD
|
||||||
|
warning:
|
||||||
|
- DL3003 # Use WORKDIR instead of cd
|
||||||
|
|
||||||
|
trustedRegistries:
|
||||||
|
- docker.io
|
||||||
|
- ghcr.io
|
||||||
|
- gcr.io
|
||||||
|
- quay.io
|
||||||
|
|
||||||
|
strict-labels: true
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
### Create .dclintrc.json
|
||||||
|
```bash
|
||||||
|
cat > .dclintrc.json << 'EOF'
|
||||||
|
{
|
||||||
|
"rules": {
|
||||||
|
"no-version-field": "error",
|
||||||
|
"require-quotes": "warning",
|
||||||
|
"service-name-case": ["error", "kebab-case"],
|
||||||
|
"no-duplicate-keys": "error",
|
||||||
|
"require-restart": "warning"
|
||||||
|
},
|
||||||
|
"exclude": [
|
||||||
|
"node_modules/**",
|
||||||
|
".git/**",
|
||||||
|
"dist/**"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
### Create .dockerignore
|
||||||
|
```bash
|
||||||
|
cat > .dockerignore << 'EOF'
|
||||||
|
# Git
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
.gitattributes
|
||||||
|
|
||||||
|
# CI/CD
|
||||||
|
.github
|
||||||
|
.gitlab-ci.yml
|
||||||
|
Jenkinsfile
|
||||||
|
|
||||||
|
# Documentation
|
||||||
|
README.md
|
||||||
|
CHANGELOG.md
|
||||||
|
docs/
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
node_modules/
|
||||||
|
vendor/
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# Build artifacts
|
||||||
|
dist/
|
||||||
|
build/
|
||||||
|
target/
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
*.pem
|
||||||
|
*.key
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
## Verification Script
|
||||||
|
|
||||||
|
Create a script to verify all tools are installed:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# verify-tools.sh
|
||||||
|
|
||||||
|
echo "🔍 Checking Docker Validation Tools..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check Docker
|
||||||
|
if command -v docker &> /dev/null; then
|
||||||
|
echo "✅ Docker: $(docker --version)"
|
||||||
|
else
|
||||||
|
echo "❌ Docker: NOT INSTALLED"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check Docker Compose
|
||||||
|
if docker compose version &> /dev/null; then
|
||||||
|
echo "✅ Docker Compose: $(docker compose version)"
|
||||||
|
else
|
||||||
|
echo "❌ Docker Compose: NOT INSTALLED"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check Hadolint
|
||||||
|
if command -v hadolint &> /dev/null; then
|
||||||
|
echo "✅ Hadolint: $(hadolint --version)"
|
||||||
|
else
|
||||||
|
echo "⚠️ Hadolint: NOT INSTALLED (recommended)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check DCLint
|
||||||
|
if command -v dclint &> /dev/null; then
|
||||||
|
echo "✅ DCLint: $(dclint --version 2>&1 | head -1)"
|
||||||
|
else
|
||||||
|
echo "⚠️ DCLint: NOT INSTALLED (recommended)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check Trivy
|
||||||
|
if command -v trivy &> /dev/null; then
|
||||||
|
echo "✅ Trivy: $(trivy --version | head -1)"
|
||||||
|
else
|
||||||
|
echo "⚠️ Trivy: NOT INSTALLED (optional)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check Node.js (for DCLint)
|
||||||
|
if command -v node &> /dev/null; then
|
||||||
|
echo "✅ Node.js: $(node --version)"
|
||||||
|
else
|
||||||
|
echo "⚠️ Node.js: NOT INSTALLED (needed for DCLint)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "📊 Installation Summary:"
|
||||||
|
echo " Required tools: Docker, Docker Compose"
|
||||||
|
echo " Recommended: Hadolint, DCLint"
|
||||||
|
echo " Optional: Trivy, Dive, Docker Bench"
|
||||||
|
```
|
||||||
|
|
||||||
|
Make it executable and run:
|
||||||
|
```bash
|
||||||
|
chmod +x verify-tools.sh
|
||||||
|
./verify-tools.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Quick Start Commands
|
||||||
|
|
||||||
|
After installation, test the tools:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Test Hadolint
|
||||||
|
echo 'FROM node:latest' > test.Dockerfile
|
||||||
|
hadolint test.Dockerfile
|
||||||
|
rm test.Dockerfile
|
||||||
|
|
||||||
|
# Test DCLint
|
||||||
|
echo 'services:
|
||||||
|
web:
|
||||||
|
image: nginx:latest' > test-compose.yml
|
||||||
|
dclint test-compose.yml
|
||||||
|
rm test-compose.yml
|
||||||
|
|
||||||
|
# Test Docker Compose validation
|
||||||
|
docker compose config --quiet
|
||||||
|
|
||||||
|
# Test Trivy (if installed)
|
||||||
|
trivy image nginx:latest
|
||||||
|
|
||||||
|
# Test full validation
|
||||||
|
./validate-docker.sh # (if you have the validation script)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Hadolint: Command not found
|
||||||
|
```bash
|
||||||
|
# Check if binary exists
|
||||||
|
ls -la /usr/local/bin/hadolint
|
||||||
|
|
||||||
|
# Check PATH
|
||||||
|
echo $PATH
|
||||||
|
|
||||||
|
# Add to PATH if needed
|
||||||
|
export PATH="/usr/local/bin:$PATH"
|
||||||
|
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc
|
||||||
|
```
|
||||||
|
|
||||||
|
### DCLint: Module not found
|
||||||
|
```bash
|
||||||
|
# Check npm global prefix
|
||||||
|
npm config get prefix
|
||||||
|
|
||||||
|
# If not in PATH, add it
|
||||||
|
export PATH="$(npm config get prefix)/bin:$PATH"
|
||||||
|
|
||||||
|
# Or use npx
|
||||||
|
npx dclint docker-compose.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docker Compose: version command not recognized
|
||||||
|
```bash
|
||||||
|
# Check Docker Compose version
|
||||||
|
docker compose version # New (v2)
|
||||||
|
docker-compose --version # Old (v1, deprecated)
|
||||||
|
|
||||||
|
# If using v1, upgrade to v2
|
||||||
|
# Follow Docker documentation for your OS
|
||||||
|
```
|
||||||
|
|
||||||
|
### Permission Denied (Linux)
|
||||||
|
```bash
|
||||||
|
# Add user to docker group
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
newgrp docker
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
docker ps
|
||||||
|
```
|
||||||
|
|
||||||
|
## CI/CD Integration
|
||||||
|
|
||||||
|
### GitHub Actions
|
||||||
|
Already includes all tools in standard ubuntu-latest runner:
|
||||||
|
```yaml
|
||||||
|
- name: Validate Docker configs
|
||||||
|
run: |
|
||||||
|
docker --version
|
||||||
|
docker compose version
|
||||||
|
# Install additional tools if needed
|
||||||
|
```
|
||||||
|
|
||||||
|
### GitLab CI
|
||||||
|
```yaml
|
||||||
|
before_script:
|
||||||
|
- apt-get update
|
||||||
|
- apt-get install -y wget
|
||||||
|
- wget -O /usr/local/bin/hadolint https://github.com/hadolint/hadolint/releases/download/v2.12.0/hadolint-Linux-x86_64
|
||||||
|
- chmod +x /usr/local/bin/hadolint
|
||||||
|
```
|
||||||
|
|
||||||
|
## Update Tools
|
||||||
|
|
||||||
|
Keep tools up to date:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Update Hadolint (macOS)
|
||||||
|
brew upgrade hadolint
|
||||||
|
|
||||||
|
# Update DCLint
|
||||||
|
npm update -g docker-compose-linter
|
||||||
|
|
||||||
|
# Update Trivy (macOS)
|
||||||
|
brew upgrade trivy
|
||||||
|
|
||||||
|
# Update Docker Desktop
|
||||||
|
# Use built-in updater or:
|
||||||
|
brew upgrade --cask docker
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**All tools installed? Run `./verify-tools.sh` to confirm!**
|
||||||
351
validation-checklist.md
Normal file
351
validation-checklist.md
Normal file
@@ -0,0 +1,351 @@
|
|||||||
|
# Docker Validation Checklist
|
||||||
|
|
||||||
|
Complete checklist for validating Docker configurations. Use this as a reference when performing manual validation.
|
||||||
|
|
||||||
|
## Dockerfile Validation Checklist
|
||||||
|
|
||||||
|
### Base Image (Critical)
|
||||||
|
- [ ] No `:latest` tags used
|
||||||
|
- [ ] Specific version pinned (e.g., `node:20.11.0-alpine`)
|
||||||
|
- [ ] Uses minimal base image (alpine, slim, or distroless variants)
|
||||||
|
- [ ] Trusted registry used (docker.io, ghcr.io, gcr.io, quay.io)
|
||||||
|
- [ ] Base image is actively maintained and supported
|
||||||
|
|
||||||
|
### Multi-Stage Build (High Priority)
|
||||||
|
- [ ] At least 2 stages for production builds (build + runtime)
|
||||||
|
- [ ] All stages named with `AS` keyword
|
||||||
|
- [ ] Artifacts copied between stages using `COPY --from=`
|
||||||
|
- [ ] Final stage uses minimal base image
|
||||||
|
- [ ] Build tools NOT present in final stage
|
||||||
|
- [ ] Only necessary files in final image
|
||||||
|
|
||||||
|
### Security (Critical)
|
||||||
|
- [ ] `USER` directive present (non-root user specified)
|
||||||
|
- [ ] Last `USER` is NOT root or 0
|
||||||
|
- [ ] No secrets in ENV variables
|
||||||
|
- [ ] No secrets in COPY/ADD commands
|
||||||
|
- [ ] No secrets in RUN commands
|
||||||
|
- [ ] No hardcoded passwords or API keys
|
||||||
|
- [ ] Uses `--chown` when copying files for non-root user
|
||||||
|
|
||||||
|
### Directory & Paths (High Priority)
|
||||||
|
- [ ] `WORKDIR` uses absolute paths (not relative)
|
||||||
|
- [ ] No use of `cd` in RUN commands
|
||||||
|
- [ ] `.dockerignore` file present
|
||||||
|
- [ ] Build context is minimal (excludes unnecessary files)
|
||||||
|
|
||||||
|
### Layer Optimization (Medium Priority)
|
||||||
|
- [ ] RUN commands combined where logical (using `&&`)
|
||||||
|
- [ ] Package manager cache cleaned (apt, apk, yum)
|
||||||
|
- [ ] Dependency files copied before source code (for better caching)
|
||||||
|
- [ ] Multi-line commands use backslash continuation
|
||||||
|
- [ ] No unnecessary layers created
|
||||||
|
|
||||||
|
### Package Management (High Priority)
|
||||||
|
- [ ] Package versions pinned (apt-get, apk, yum)
|
||||||
|
- [ ] Package cache cleaned after installation
|
||||||
|
- [ ] Uses `--no-install-recommends` for apt-get
|
||||||
|
- [ ] Uses `--virtual` for build dependencies in alpine
|
||||||
|
- [ ] Python: Versions pinned in requirements.txt
|
||||||
|
- [ ] Node: Uses `npm ci` instead of `npm install`
|
||||||
|
|
||||||
|
### Best Practices (Medium Priority)
|
||||||
|
- [ ] `HEALTHCHECK` instruction defined
|
||||||
|
- [ ] Uses `COPY` instead of `ADD` (unless extracting archives)
|
||||||
|
- [ ] `CMD` and `ENTRYPOINT` use JSON notation
|
||||||
|
- [ ] Labels included (maintainer, version, description)
|
||||||
|
- [ ] Appropriate EXPOSE directives for documented ports
|
||||||
|
- [ ] ENV variables clearly defined
|
||||||
|
- [ ] Build args used for customization points
|
||||||
|
|
||||||
|
### Documentation (Low Priority)
|
||||||
|
- [ ] Comments explain complex operations
|
||||||
|
- [ ] Each stage has descriptive comment
|
||||||
|
- [ ] Unusual patterns are documented
|
||||||
|
- [ ] Maintainer/author documented in labels
|
||||||
|
|
||||||
|
## Hadolint Rule Reference
|
||||||
|
|
||||||
|
| Rule | Description | Severity | Check |
|
||||||
|
|------|-------------|----------|-------|
|
||||||
|
| DL3000 | Use absolute WORKDIR | Error | [ ] |
|
||||||
|
| DL3001 | Some commands should not be used | Warning | [ ] |
|
||||||
|
| DL3002 | Last USER should not be root | Error | [ ] |
|
||||||
|
| DL3003 | Use WORKDIR to switch directories | Warning | [ ] |
|
||||||
|
| DL3006 | Always tag image explicitly | Warning | [ ] |
|
||||||
|
| DL3007 | Using latest is prone to errors | Warning | [ ] |
|
||||||
|
| DL3008 | Pin versions in apt-get install | Warning | [ ] |
|
||||||
|
| DL3009 | Delete apt-get lists after installing | Info | [ ] |
|
||||||
|
| DL3013 | Pin versions in pip | Warning | [ ] |
|
||||||
|
| DL3014 | Use -y flag with apt-get | Warning | [ ] |
|
||||||
|
| DL3015 | Avoid additional packages | Info | [ ] |
|
||||||
|
| DL3016 | Pin versions in npm | Warning | [ ] |
|
||||||
|
| DL3018 | Pin versions in apk add | Warning | [ ] |
|
||||||
|
| DL3019 | Use --no-cache with apk add | Info | [ ] |
|
||||||
|
| DL3020 | Use COPY instead of ADD | Error | [ ] |
|
||||||
|
| DL3022 | COPY --from should reference stage | Error | [ ] |
|
||||||
|
| DL3025 | Use JSON for CMD and ENTRYPOINT | Warning | [ ] |
|
||||||
|
|
||||||
|
## Docker Compose Validation Checklist
|
||||||
|
|
||||||
|
### Modern Syntax (Critical)
|
||||||
|
- [ ] NO `version` field present (obsolete since Compose v2.27.0)
|
||||||
|
- [ ] File uses modern Compose Specification syntax
|
||||||
|
- [ ] Compatible with Docker Compose v2.27.0+
|
||||||
|
|
||||||
|
### Service Configuration (High Priority)
|
||||||
|
- [ ] All services have specific image tags (no `:latest`)
|
||||||
|
- [ ] Restart policies defined (`restart: unless-stopped`)
|
||||||
|
- [ ] Service dependencies specified (`depends_on`)
|
||||||
|
- [ ] Container names specified (optional but recommended)
|
||||||
|
- [ ] All services have descriptive names (kebab-case)
|
||||||
|
|
||||||
|
### Health Checks (High Priority)
|
||||||
|
- [ ] Critical services have health checks
|
||||||
|
- [ ] Health check intervals are reasonable
|
||||||
|
- [ ] Health check timeout values appropriate
|
||||||
|
- [ ] Start period allows for initialization
|
||||||
|
- [ ] Retries configured for reliability
|
||||||
|
|
||||||
|
### Resource Management (Medium Priority)
|
||||||
|
- [ ] Resource limits defined (memory, CPU)
|
||||||
|
- [ ] Resource reservations specified
|
||||||
|
- [ ] PID limits set (if applicable)
|
||||||
|
- [ ] Ulimits configured (if needed)
|
||||||
|
|
||||||
|
### Networking (High Priority)
|
||||||
|
- [ ] Custom networks defined (not default bridge)
|
||||||
|
- [ ] Network drivers specified
|
||||||
|
- [ ] Network isolation implemented
|
||||||
|
- [ ] Port mappings use host IP when needed
|
||||||
|
- [ ] Internal networks used for backend services
|
||||||
|
|
||||||
|
### Volumes & Persistence (High Priority)
|
||||||
|
- [ ] Named volumes used for persistence
|
||||||
|
- [ ] Volume drivers specified
|
||||||
|
- [ ] Bind mounts use absolute paths
|
||||||
|
- [ ] Volume permissions appropriate
|
||||||
|
- [ ] No sensitive data in bind mounts
|
||||||
|
- [ ] Volumes section defines named volumes
|
||||||
|
|
||||||
|
### Environment & Configuration (Critical)
|
||||||
|
- [ ] Environment variables properly defined
|
||||||
|
- [ ] No hardcoded secrets in compose file
|
||||||
|
- [ ] `.env` file used for configuration
|
||||||
|
- [ ] Secrets managed with Docker secrets or external
|
||||||
|
- [ ] ENV files specified with `env_file`
|
||||||
|
|
||||||
|
### Security (Critical)
|
||||||
|
- [ ] No `privileged: true` (unless absolutely necessary)
|
||||||
|
- [ ] Capabilities properly configured
|
||||||
|
- [ ] User/group specified for services
|
||||||
|
- [ ] Read-only root filesystem (where applicable)
|
||||||
|
- [ ] Security options configured
|
||||||
|
- [ ] AppArmor/SELinux profiles defined
|
||||||
|
|
||||||
|
### Logging (Medium Priority)
|
||||||
|
- [ ] Logging drivers configured
|
||||||
|
- [ ] Log rotation configured
|
||||||
|
- [ ] Log size limits set
|
||||||
|
- [ ] Appropriate log drivers for environment
|
||||||
|
|
||||||
|
### Build Configuration (if using build)
|
||||||
|
- [ ] Build context clearly specified
|
||||||
|
- [ ] Build args defined if needed
|
||||||
|
- [ ] Dockerignore file present
|
||||||
|
- [ ] Target stage specified for multi-stage
|
||||||
|
- [ ] Cache from configured for faster builds
|
||||||
|
|
||||||
|
## Multi-Stage Build Specific Checks
|
||||||
|
|
||||||
|
### Stage Structure
|
||||||
|
- [ ] Build stage uses full toolchain image
|
||||||
|
- [ ] Build stage installs ALL dependencies
|
||||||
|
- [ ] Build stage compiles/builds artifacts
|
||||||
|
- [ ] Runtime stage uses minimal image
|
||||||
|
- [ ] Runtime stage copies only artifacts
|
||||||
|
- [ ] Runtime stage installs only runtime deps
|
||||||
|
|
||||||
|
### Node.js Multi-Stage
|
||||||
|
- [ ] Build stage: `npm ci` (not `npm install`)
|
||||||
|
- [ ] Build stage: `npm run build`
|
||||||
|
- [ ] Build stage: `npm run test` (optional)
|
||||||
|
- [ ] Runtime stage: `npm ci --only=production`
|
||||||
|
- [ ] Runtime stage: Copies from builder `dist/build` folder
|
||||||
|
- [ ] Runtime stage: Uses alpine variant
|
||||||
|
|
||||||
|
### Python Multi-Stage
|
||||||
|
- [ ] Build stage: Compiles wheels
|
||||||
|
- [ ] Build stage: Installs build dependencies
|
||||||
|
- [ ] Build stage: Creates virtual environment
|
||||||
|
- [ ] Runtime stage: Installs pre-built wheels
|
||||||
|
- [ ] Runtime stage: Minimal Python image (alpine/slim)
|
||||||
|
- [ ] Runtime stage: No compiler or build tools
|
||||||
|
|
||||||
|
### Go Multi-Stage
|
||||||
|
- [ ] Build stage: Full Go image
|
||||||
|
- [ ] Build stage: CGO_ENABLED=0 for static binary
|
||||||
|
- [ ] Build stage: Builds binary
|
||||||
|
- [ ] Runtime stage: `scratch` or `distroless`
|
||||||
|
- [ ] Runtime stage: Only binary copied
|
||||||
|
- [ ] Runtime stage: Certificates copied if needed
|
||||||
|
|
||||||
|
## Security Checklist
|
||||||
|
|
||||||
|
### Image Security
|
||||||
|
- [ ] Base images scanned for vulnerabilities
|
||||||
|
- [ ] No images older than 6 months without review
|
||||||
|
- [ ] Images from trusted sources only
|
||||||
|
- [ ] Image digests used for critical deployments
|
||||||
|
- [ ] Regular security updates applied
|
||||||
|
|
||||||
|
### Runtime Security
|
||||||
|
- [ ] Runs as non-root user (UID > 0)
|
||||||
|
- [ ] Minimal capabilities granted
|
||||||
|
- [ ] No unnecessary privileges
|
||||||
|
- [ ] Read-only root filesystem where possible
|
||||||
|
- [ ] Temporary directories properly configured
|
||||||
|
|
||||||
|
### Network Security
|
||||||
|
- [ ] Only necessary ports exposed
|
||||||
|
- [ ] Internal networks for backend communication
|
||||||
|
- [ ] No host network mode (unless required)
|
||||||
|
- [ ] Firewall rules configured
|
||||||
|
- [ ] TLS/SSL for external communications
|
||||||
|
|
||||||
|
### Data Security
|
||||||
|
- [ ] No secrets in image layers
|
||||||
|
- [ ] Secrets managed via secrets management
|
||||||
|
- [ ] Sensitive volumes properly protected
|
||||||
|
- [ ] Encryption at rest configured
|
||||||
|
- [ ] Backup strategy for persistent data
|
||||||
|
|
||||||
|
### Access Control
|
||||||
|
- [ ] Least privilege principle applied
|
||||||
|
- [ ] Appropriate user permissions
|
||||||
|
- [ ] No root access to containers
|
||||||
|
- [ ] Host resources properly isolated
|
||||||
|
- [ ] Volume mounts restricted
|
||||||
|
|
||||||
|
## CI/CD Integration Checklist
|
||||||
|
|
||||||
|
### Pre-commit Validation
|
||||||
|
- [ ] Pre-commit hook validates Dockerfiles
|
||||||
|
- [ ] Pre-commit hook checks Compose files
|
||||||
|
- [ ] Hook checks for obsolete version field
|
||||||
|
- [ ] Hook runs Hadolint/DCLint
|
||||||
|
- [ ] Hook prevents commits with critical issues
|
||||||
|
|
||||||
|
### Pipeline Validation
|
||||||
|
- [ ] Hadolint runs on all Dockerfiles
|
||||||
|
- [ ] Docker Compose config validation
|
||||||
|
- [ ] DCLint runs on Compose files
|
||||||
|
- [ ] Security scanning integrated (Trivy, Snyk)
|
||||||
|
- [ ] Build tests before merge
|
||||||
|
- [ ] Automated PR comments with issues
|
||||||
|
|
||||||
|
### Deployment Validation
|
||||||
|
- [ ] Validation runs before deployment
|
||||||
|
- [ ] Rollback on validation failure
|
||||||
|
- [ ] Health checks verified post-deployment
|
||||||
|
- [ ] Smoke tests after deployment
|
||||||
|
- [ ] Monitoring alerts configured
|
||||||
|
|
||||||
|
## Common Issue Quick Reference
|
||||||
|
|
||||||
|
### ❌ Using :latest Tag
|
||||||
|
**Check:** `grep -r ":latest" Dockerfile docker-compose.yml`
|
||||||
|
**Fix:** Pin specific version (e.g., `nginx:1.24-alpine`)
|
||||||
|
|
||||||
|
### ❌ Obsolete Version Field
|
||||||
|
**Check:** `grep "^version:" docker-compose.yml`
|
||||||
|
**Fix:** Remove the entire `version:` line
|
||||||
|
|
||||||
|
### ❌ Running as Root
|
||||||
|
**Check:** `grep "^USER" Dockerfile | tail -1`
|
||||||
|
**Fix:** Add `USER <non-root-user>` before CMD/ENTRYPOINT
|
||||||
|
|
||||||
|
### ❌ No Multi-Stage Build
|
||||||
|
**Check:** `grep -c "^FROM" Dockerfile`
|
||||||
|
**Fix:** Implement at least 2 stages
|
||||||
|
|
||||||
|
### ❌ Package Cache Not Cleaned
|
||||||
|
**Check:** Look for apt/apk without cleanup
|
||||||
|
**Fix:** Add `rm -rf /var/lib/apt/lists/*` or `--no-cache`
|
||||||
|
|
||||||
|
### ❌ Using ADD Instead of COPY
|
||||||
|
**Check:** `grep "^ADD" Dockerfile`
|
||||||
|
**Fix:** Replace with `COPY` unless extracting archives
|
||||||
|
|
||||||
|
### ❌ No Health Check
|
||||||
|
**Check:** `grep "HEALTHCHECK" Dockerfile`
|
||||||
|
**Fix:** Add appropriate HEALTHCHECK instruction
|
||||||
|
|
||||||
|
### ❌ No Restart Policy
|
||||||
|
**Check:** `grep "restart:" docker-compose.yml`
|
||||||
|
**Fix:** Add `restart: unless-stopped` to services
|
||||||
|
|
||||||
|
## Validation Priority Matrix
|
||||||
|
|
||||||
|
| Priority | Dockerfile | Docker Compose | Multi-Stage | Security |
|
||||||
|
|----------|-----------|----------------|-------------|----------|
|
||||||
|
| CRITICAL | No :latest, USER set | No version field | N/A | Non-root user |
|
||||||
|
| HIGH | HEALTHCHECK, WORKDIR | Restart policy, Health checks | 2+ stages | No secrets |
|
||||||
|
| MEDIUM | Layer optimization | Resource limits | Named stages | Minimal image |
|
||||||
|
| LOW | Comments, Labels | Logging config | Optimization | Hardening |
|
||||||
|
|
||||||
|
## Tool-Specific Validation
|
||||||
|
|
||||||
|
### Hadolint Configuration (.hadolint.yaml)
|
||||||
|
```yaml
|
||||||
|
ignored:
|
||||||
|
- DL3008 # Pin apt versions (too strict for some use cases)
|
||||||
|
override:
|
||||||
|
error:
|
||||||
|
- DL3002 # Last USER must not be root
|
||||||
|
- DL3020 # Use COPY not ADD
|
||||||
|
trustedRegistries:
|
||||||
|
- docker.io
|
||||||
|
- ghcr.io
|
||||||
|
- gcr.io
|
||||||
|
```
|
||||||
|
|
||||||
|
### DCLint Configuration (.dclintrc.json)
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"rules": {
|
||||||
|
"no-version-field": "error",
|
||||||
|
"require-quotes": "warning",
|
||||||
|
"no-duplicate-keys": "error"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Quick Validation Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Validate Dockerfile
|
||||||
|
hadolint Dockerfile
|
||||||
|
|
||||||
|
# Validate Docker Compose
|
||||||
|
docker compose config --quiet
|
||||||
|
|
||||||
|
# Check for obsolete version field
|
||||||
|
grep "^version:" docker-compose.yml
|
||||||
|
|
||||||
|
# Count FROM statements (multi-stage check)
|
||||||
|
grep -c "^FROM" Dockerfile
|
||||||
|
|
||||||
|
# Check final USER
|
||||||
|
grep "^USER" Dockerfile | tail -1
|
||||||
|
|
||||||
|
# Find :latest tags
|
||||||
|
grep -r ":latest" .
|
||||||
|
|
||||||
|
# Full validation
|
||||||
|
./validate-docker.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Use this checklist to ensure comprehensive validation of all Docker configurations.**
|
||||||
Reference in New Issue
Block a user