OSCAL Report Generator: a web application for generating compliance documentation from OSCAL catalogs. This guide covers Docker Hub publishing, setup, and usage.
- Overview
- Quick Start
- Deployment Methods Comparison
- Setup Instructions
- Using Published Images
- Updating
- Default Credentials
- CI/CD Pipeline
- Verification & Testing
- Troubleshooting
- Maintenance & Best Practices
- Support
The OSCAL Report Generator is automatically published to Docker Hub, making it easy for users to pull and run without building from source.
- Docker Hub (Public) -
keekar/oscal_reports - GitHub Container Registry (GHCR) -
ghcr.io/[owner]/oscal-report-generator
| Branch | Docker Hub Tags | Description |
|---|---|---|
main |
latest, v{version}, main-{sha} |
Stable production releases |
Development |
edge, v{version}, Development-{sha} |
Latest development builds |
Images are built for multiple architectures:
- ✅ linux/amd64 - Intel/AMD 64-bit processors
- ✅ linux/arm64 - ARM 64-bit processors (Apple Silicon, ARM servers)
For Users:
- ✅ No build required - just pull and run
- ✅ Fast downloads via Docker Hub CDN
- ✅ Cross-platform support
- ✅ Version control and easy rollbacks
- ✅ Public access - no authentication needed
For Developers:
- ✅ Automated publishing on every push
- ✅ Version tracking
- ✅ CI/CD integrated
- ✅ Multi-registry redundancy
- Automated Control Suggestions: AI-powered recommendations for control implementations
- AI Telemetry Logging: OpenTelemetry-compliant logging of all AI interactions
- Multiple Frameworks: NIST SP 800-53, Australian ISM, Singapore IM8
- Multiple Export Formats: OSCAL JSON, Excel, PDF, and CCM
- Smart Catalog Updates: Automatically detect new/changed controls
- Data Persistence: Browser-based local storage and optional volume mount for config
- Auto-save: Automatic progress saving
- Modern UI: Intuitive, responsive interface
# Pull the latest stable version
docker pull keekar/oscal_reports:latest
# Run the container
docker run -d \
--name oscal-app \
-p 3020:3020 \
keekar/oscal_reports:latest
# Access the application
open http://localhost:3020For TrueNAS Blue-Green deployments you can use:
| Method | Script | Speed | Use Case |
|---|---|---|---|
| Pull-based | install_from_dockerhub.sh |
1–3 min | Production, standard updates, automatic rollback |
| Build-based | docker build (root Dockerfile) |
10–15 min | Development, custom builds, or when Docker Hub is unavailable |
Pull-based (recommended for production): Pulls pre-built image from Docker Hub, backs up data, runs health check, auto-rollback on failure. Requires Docker Hub access.
Build-based: Build the image locally from this repository’s root Dockerfile. Use when you need custom code, a specific branch, or when Docker Hub is unavailable. No automatic rollback from this path unless you manage images yourself.
You can build the image on your laptop (Docker Desktop) and push it to Docker Hub so others can pull it, without using GitHub Actions. This is useful when the CI workflow fails or you prefer to publish from your machine. The script uses Docker Buildx to build for both linux/amd64 and linux/arm64 (multi-platform), so the published image works on Intel/AMD servers and Apple Silicon, matching the GitHub workflow.
Prerequisites
- Install Docker Desktop and ensure
docker(and Buildx) is available. - Log in to Docker Hub: run
docker loginand enter your Docker Hub username and password (or access token).
Steps
-
From the repository root, run the build-and-push script. It reads the version from
package.jsonand tags the image asv<VERSION>(e.g.v1.9.0), then pushes that tag and alsolatest:DOCKERHUB_USERNAME=keekar ./scripts/build-and-push-dockerhub.sh
-
To use an explicit tag (e.g. a specific version or
latestonly):./scripts/build-and-push-dockerhub.sh v1.9.0
-
If your Docker Hub username is not
keekar, set it in the environment:export DOCKERHUB_USERNAME=your_username ./scripts/build-and-push-dockerhub.sh
The image name and tag format match the GitHub workflow (e.g. keekar/oscal_reports:v1.9.0), so pull commands for users stay the same. The CI workflow (on tag push or manual trigger) can still be used when you want to publish from GitHub.
# Stable production release
docker pull keekar/oscal_reports:latest
# Latest development build
docker pull keekar/oscal_reports:edge
# Specific version
docker pull keekar/oscal_reports:v1.6.3Mount /app/config to persist user data and configuration:
# Create config directory
mkdir -p ./config
# Run with volume mount
docker run -d \
--name oscal-app \
-p 3020:3020 \
-v $(pwd)/config:/app/config \
keekar/oscal_reports:latestWhat gets persisted: User credentials and authentication data, application settings, user preferences, and session data.
To enable Generic SSO (Authentik) and the Guardian Agent assessment feature, copy .env.docker.example to .env.docker,
fill in the values and start with docker compose --env-file .env.docker up -d (or let scripts/install_from_dockerhub.sh
pick the file up). Full guide: GUARDIAN_SSO_DOCKER_DEPLOYMENT.md.
Create docker-compose.yml:
version: '3.8'
services:
oscal-app:
image: keekar/oscal_reports:latest
container_name: oscal-app
ports:
- "3020:3020"
volumes:
- ./config:/app/config
environment:
- NODE_ENV=production
- PORT=3020
restart: unless-stoppedRun:
docker-compose up -dFor TrueNAS Blue-Green deployments, we provide an automated deployment script that pulls from Docker Hub with automatic backup, restore, and rollback capabilities.
- ✅ Fast Deployment: Pull pre-built images (1-3 minutes vs 10-15 minutes for build)
- ✅ Automatic Backup: Both API export and volume directory backup
- ✅ Auto Rollback: Automatically reverts to previous version if health checks fail
- ✅ Zero Data Loss: Preserves users, config, and data across updates
- ✅ Blue-Green Support: Automatic detection of deployment instance
- ✅ Concurrent Protection: Prevents simultaneous deployments with lock mechanism
# Navigate to your Blue or Green deployment directory
cd /path/to/OSCAL_Blue # or OSCAL_Green
# Run the deployment script
./scripts/install_from_dockerhub.sh
# The script will:
# 1. Detect Blue/Green instance automatically
# 2. Backup current data (API + volume)
# 3. Pull latest image from Docker Hub
# 4. Deploy with automatic health verification
# 5. Rollback automatically if deployment fails# Force deployment (override lock file)
./scripts/install_from_dockerhub.sh --force
# Skip API backup (use volume backup only)
./scripts/install_from_dockerhub.sh --skip-backup
# Combine options
./scripts/install_from_dockerhub.sh --force --skip-backupThe script follows this workflow:
- Detect Environment: Automatically identifies Blue/Green instance
- Prerequisites Check: Verifies Docker, connectivity, and disk space
- Lock Creation: Prevents concurrent deployments
- API Backup: Exports users and config via API (optional)
- Volume Backup: Creates compressed backup of data directory
- Save Current Image: Tags current image for rollback capability
- Pull from Docker Hub: Downloads latest image with architecture detection
- Extract Credentials: Shows default credentials from new image
- Deploy: Stops old container and starts new one
- Health Check: Verifies new deployment (60-second timeout)
- Restore Data: Applies backed-up configuration and users
- Auto Rollback: Reverts to previous version if health checks fail
- Cleanup: Removes old containers and dangling images
| Feature | Local docker build (root Dockerfile) |
install_from_dockerhub.sh |
|---|---|---|
| Speed | 10-15 minutes | 1-3 minutes |
| Internet | Git clone only | Docker Hub pull required |
| Disk Space | Higher (source + build) | Lower (image only) |
| Customization | Full (edit source) | None (pre-built) |
| Use Case | Development, custom builds | Production, quick updates |
| Rollback | Manual | Automatic |
| Backup | Manual (via config persistence) | Automatic (API + volume) |
| Risk | Higher (untested build) | Lower (tested image) |
Use install_from_dockerhub.sh when:
- ✅ Deploying to production TrueNAS
- ✅ Need fast, reliable updates
- ✅ Want automatic rollback protection
- ✅ Using scheduled cron deployments
- ✅ Docker Hub is accessible
Use a local docker build (repo root) when:
- ✅ Developing or testing custom changes
- ✅ Building from a specific Git branch or fork
- ✅ Docker Hub is unavailable
- ✅ You need source-level modifications before image build
- ✅ First-time setup with a custom image tag or compose overlay
Schedule monthly deployments using cron:
# Edit crontab
crontab -e
# Green: Deploy on 1st, 3rd, 5th Sunday at 2 AM
0 2 1-7,15-21,29-31 * 0 cd /mnt/pool/OSCAL_Green && ./scripts/install_from_dockerhub.sh >> /var/log/oscal-green-deploy.log 2>&1
# Blue: Deploy on 2nd, 4th Sunday at 2 AM
0 2 8-14,22-28 * 0 cd /mnt/pool/OSCAL_Blue && ./scripts/install_from_dockerhub.sh >> /var/log/oscal-blue-deploy.log 2>&1Backups are stored in backups/dockerhub-deploy-YYYYMMDD-HHMMSS/:
# List backups
ls -lh backups/
# Restore from backup manually if needed
cd backups/dockerhub-deploy-20250128-140530/
tar -xzf volume-backup.tar.gz -C /path/to/data/volume/
# Clean up old backups (older than 7 days)
find backups/ -name 'dockerhub-deploy-*' -type d -mtime +7 -exec rm -rf {} +If automatic rollback occurs:
- Failed container is stopped and removed
- Failed image is tagged for debugging:
oscal-report-generator:blue-failed-TIMESTAMP - Previous container is restored and started
- Previous configuration is reapplied
- Health verification confirms rollback success
Manual rollback (if needed):
# Check available backup images
docker images | grep oscal-report-generator
# Stop current container
docker stop oscal-report-generator-blue
# Remove current container
docker rm oscal-report-generator-blue
# Start from backup image
docker tag oscal-report-generator:blue-backup-20250128-140530 oscal-report-generator:blue
./scripts/install_from_dockerhub.shIssue: Script fails with "Docker Hub unreachable"
# Check connectivity
ping -c 3 hub.docker.com
# Check Docker Hub status
curl -s https://status.docker.com/api/v2/status.json | jq
# Alternative: build image from source (repo root)
docker build -t oscal-report-generator:local .Issue: Lock file exists
# Check if deployment is actually running
ps aux | grep install_from_dockerhub
# Force deployment if safe
./scripts/install_from_dockerhub.sh --force
# Or manually remove stale lock
rm -f /tmp/oscal-deploy-blue.lock # or green.lockIssue: Health check fails
# Check container logs
docker logs oscal-report-generator-blue
# Check if port is accessible
curl http://localhost:3020/health
# Manual health verification
docker exec oscal-report-generator-blue wget -qO- http://localhost:3020/healthIssue: Credentials not extracted
# Check container logs for default credentials
docker logs oscal-report-generator-blue | grep -A 20 "Default Credentials"
# Or check the backup directory
cat backups/dockerhub-deploy-*/credentials.txt- Test First: Always test deployment script in Green environment before Blue
- Monitor Logs: Watch deployment logs in real-time during first use
- Backup Verification: Verify backups are created before scheduling cron jobs
- Stagger Deployments: Don't deploy Blue and Green simultaneously
- Keep Backups: Maintain at least 2-3 recent backups for safety
- Document Customizations: Track any local configuration changes
- Health Monitoring: Set up external monitoring for critical deployments
- GitHub repository with admin access
- Docker Hub account (username:
keekar) - Ability to create GitHub secrets
-
Log in to Docker Hub
- Go to https://hub.docker.com/
- Sign in with your credentials
-
Navigate to Security Settings
- Click profile icon (top right)
- Select Account Settings
- Click Security → Access Tokens
-
Generate New Token
- Click New Access Token
- Configuration:
- Description:
OSCAL_GitHub_Actions - Permissions: Read, Write, Delete
- Description:
- Click Generate
-
Copy the Token
⚠️ IMPORTANT: Copy immediately!- You won't see it again after closing
- Keep it safe for the next step
-
Navigate to Repository Settings
- Go to:
https://github.com/[your-org]/OSCAL-Reports - Click Settings tab
- Go to Secrets and variables → Actions
- Go to:
-
Add DOCKERHUB_USERNAME
- Click New repository secret
- Name:
DOCKERHUB_USERNAME - Value:
keekar - Click Add secret
-
Add DOCKERHUB_TOKEN
- Click New repository secret
- Name:
DOCKERHUB_TOKEN - Value: Paste the access token from Step 1
- Click Add secret
-
Verify Setup
- You should see both secrets listed:
DOCKERHUB_USERNAMEDOCKERHUB_TOKEN
- You should see both secrets listed:
Use this checklist to ensure complete setup:
- Log in to Docker Hub (https://hub.docker.com/)
- Create repository
oscal_reports(Public visibility) - Generate access token with Read, Write, Delete permissions
- Copy token immediately
- Navigate to Settings → Secrets and variables → Actions
- Add
DOCKERHUB_USERNAMEsecret =keekar - Add
DOCKERHUB_TOKENsecret = (paste token) - Verify both secrets appear in list
- Push to Development branch (creates
edgetag) - Monitor GitHub Actions workflow
- Verify image on Docker Hub
- Test pulling:
docker pull keekar/oscal_reports:edge - Test running and accessing at http://localhost:3020
- Update repository description on Docker Hub
- Add repository links (GitHub, docs)
- Add tags: oscal, compliance, security, ssp, soa, ccm, nist
- Verify multi-platform images (amd64, arm64)
- Test on different platforms if available
- Verify image size < 500MB
- Test credentials extraction
- Verify badges work
# Pull latest
docker pull keekar/oscal_reports:latest
# Run
docker run -d --name oscal-app -p 3020:3020 keekar/oscal_reports:latest
# Check health
curl http://localhost:3020/health
# View logs
docker logs oscal-app
# Stop and remove
docker stop oscal-app && docker rm oscal-app# Map to port 8080
docker run -d \
--name oscal-app \
-p 8080:3020 \
keekar/oscal_reports:latest
# Access at http://localhost:8080# Pin to specific version
docker pull keekar/oscal_reports:v1.6.3
# Run with resource limits and restart policy
docker run -d \
--name oscal-prod \
-p 3020:3020 \
-v /opt/oscal/config:/app/config \
--restart unless-stopped \
--memory="1g" \
--cpus="1.0" \
keekar/oscal_reports:v1.6.3# Pull edge build
docker pull keekar/oscal_reports:edge
# Run on different port
docker run -d \
--name oscal-dev \
-p 3021:3020 \
keekar/oscal_reports:edge# For Intel/AMD systems
docker pull --platform linux/amd64 keekar/oscal_reports:latest
# For Apple Silicon / ARM
docker pull --platform linux/arm64 keekar/oscal_reports:latest# Pull the latest image
docker pull keekar/oscal_reports:latest
# Stop and remove old container
docker stop oscal-app
docker rm oscal-app
# Start new container with same configuration
docker run -d \
--name oscal-app \
-p 3020:3020 \
-v $(pwd)/config:/app/config \
keekar/oscal_reports:latestdocker-compose pull
docker-compose up -dThe Docker image generates timestamp-based default credentials during build. Each build gets a unique default password derived from its build time; the exact derivation is intentionally not published here so defaults can't be guessed from a known build timestamp. Retrieve the actual generated value using one of the methods below, and change it immediately after first login.
- admin - Platform administrator
- user - Standard user
- assessor - Assessor role
# Pull the image
docker pull keekar/oscal_reports:latest
# Create temporary container
docker create --name temp-oscal keekar/oscal_reports:latest
# Extract credentials file
docker cp temp-oscal:/app/credentials.txt ./credentials.txt
# View credentials
cat credentials.txt
# Clean up
docker rm temp-oscal- Go to Actions tab
- Click on latest workflow run
- View credentials in job summary (displayed directly)
- Or download from "Artifacts" section
Note: Artifact URLs don't work directly in browsers. Use Method 1 or GitHub UI.
Change default passwords immediately after first login!
The workflow is triggered on:
- Push to
mainbranch → Publisheslatesttag - Push to
Developmentbranch → Publishesedgetag
- Run Tests - Backend, frontend, integration tests
- Code Quality - Security scans and validation
- Version Check - Ensures consistency across package.json files
- Docker Build - Multi-platform build (amd64, arm64)
- Push to Registries:
- GitHub Container Registry (GHCR)
- Docker Hub (public)
- Extract Credentials - Saves to artifacts and job summary
- Generate Reports - Deployment instructions
File: .github/workflows/ci-cd.yml
Key sections:
- name: 🔐 Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: 🏷️ Docker metadata for tags
id: docker-meta
uses: docker/metadata-action@v5
with:
images: |
ghcr.io/${{ github.repository_owner }}/oscal-report-generator
keekar/oscal_reports
tags: |
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
type=raw,value=edge,enable=${{ github.ref == 'refs/heads/Development' }}
type=semver,pattern={{version}}Visit: https://hub.docker.com/r/keekar/oscal_reports
Check:
- Pull counts
- Available tags
- Image sizes
- Security scan results
# View image metadata
docker inspect keekar/oscal_reports:latest
# Check image size
docker images keekar/oscal_reports
# View image history/layers
docker history keekar/oscal_reports:latest
# View labels
docker image inspect keekar/oscal_reports:latest | jq '.[0].Config.Labels'# Run container
docker run -d --name test-oscal -p 3020:3020 keekar/oscal_reports:latest
# Test health endpoint
curl http://localhost:3020/health
# Expected: {"status":"healthy",...}
# View logs
docker logs test-oscal
# Test in browser
open http://localhost:3020
# Clean up
docker stop test-oscal && docker rm test-oscal# Inspect manifest for multiple platforms
docker manifest inspect keekar/oscal_reports:latest
# Should show:
# - linux/amd64
# - linux/arm64# Check container health status
docker ps --filter name=oscal-app --format "table {{.Names}}\t{{.Status}}"
# Manual health check
curl http://localhost:3020/health
# View detailed container info
docker inspect oscal-app | jq '.[0].State.Health'Problem: Docker build fails in CI/CD pipeline
Solutions:
- Check all tests pass before build step
- Verify Dockerfile syntax is correct
- Review GitHub Actions workflow logs
- Check if sufficient disk space available
- Verify all dependencies are accessible
Problem: unauthorized: authentication required
Solutions:
- Verify
DOCKERHUB_USERNAMEsecret is exactlykeekar - Regenerate Docker Hub access token
- Ensure token has Write permissions
- Check if Docker Hub account is active
- Verify token hasn't been revoked
Problem: Error response from daemon: pull access denied
Solutions:
- Verify repository name:
keekar/oscal_reports - Check repository is public on Docker Hub
- Try:
docker pull keekar/oscal_reports:latest - Check Docker Hub status page
Problem: exec format error when running container
Solutions:
# Check architecture
docker inspect keekar/oscal_reports:latest | jq '.[0].Architecture'
# Force specific platform
docker pull --platform linux/amd64 keekar/oscal_reports:latest
# or
docker pull --platform linux/arm64 keekar/oscal_reports:latestCause: Tags built with the GitHub workflow are multi-platform (linux/amd64 and linux/arm64), so they run on both Intel/AMD and Apple Silicon. Tags built with a local script using plain docker build are single-platform (e.g. arm64 only when built on a Mac M1/M4). When you pull a single-platform image on a different architecture (e.g. amd64 server), it can fail or use slow emulation.
Solution: Use the updated scripts/build-and-push-dockerhub.sh, which uses Docker Buildx to build for both linux/amd64 and linux/arm64, matching the GitHub workflow. Rebuild and push the failing tag (e.g. ./scripts/build-and-push-dockerhub.sh v1.7.25); the new image will work on both architectures. See Local build and publish in this guide.
Problem: Container exits immediately
Solutions:
# Check logs for errors
docker logs oscal-app
# Check if port is already in use
lsof -i :3020 # macOS/Linux
netstat -ano | findstr :3020 # Windows
# Try different port
docker run -d --name oscal-app -p 8080:3020 keekar/oscal_reports:latestProblem: Can't reach http://localhost:3020
Solutions:
- Verify container is running:
docker ps | grep oscal-app - Check port mapping:
docker port oscal-app - Test health endpoint:
curl http://localhost:3020/health - Check firewall rules
- Verify no proxy/VPN interference
Problem: Error: Username and password required
Solutions:
- Verify secret names are exactly:
DOCKERHUB_USERNAME(case-sensitive)DOCKERHUB_TOKEN(case-sensitive)
- Re-add secrets if needed
- Check secrets in correct repository
- Verify workflow file references correct secret names
Problem: Build succeeds but no image published
Solutions:
- Check workflow succeeded in GitHub Actions
- Verify branch is
mainorDevelopment - Check Docker Hub repository name is correct
- Review workflow logs for push errors
- Verify Docker Hub account has space available
Docker Hub tokens don't expire by default, but if you see auth errors:
- Go to Docker Hub → Account Settings → Security → Access Tokens
- Check if token is still active
- Generate new token if needed
- Update
DOCKERHUB_TOKENsecret in GitHub - Test with new push
# Test login with token
echo "$DOCKERHUB_TOKEN" | docker login -u keekar --password-stdin
# Should return: Login Succeeded- ✅ Never commit credentials to repository
- ✅ Use access tokens instead of passwords
- ✅ Rotate tokens periodically (every 90 days recommended)
- ✅ Limit token permissions to what's needed
- ✅ Enable 2FA on Docker Hub account
- ✅ Review access logs regularly
- ✅ Delete unused tokens promptly
# 1. Generate new token on Docker Hub
# 2. Update GitHub secret
gh secret set DOCKERHUB_TOKEN
# 3. Test with push to Development
git checkout Development
git commit --allow-empty -m "Test: Token rotation"
git push
# 4. Delete old token from Docker HubDocker Hub has pull limits. Manage images:
- Delete unused tags regularly
- Keep last 10 versions
- Always keep
latestandedgetags - Delete old development/test tags
- Consider Docker Hub Pro for higher limits
Visit Docker Hub to monitor:
- Pull counts
- Star ratings
- Image sizes
- Security scan results
- Download trends
# GitHub Actions notifications
# Settings → Notifications → Actions
# Set up:
# - Workflow failure alerts
# - Build duration alerts
# - Image size alertsWhen modifying workflow:
- Test changes in separate branch
- Verify with Development branch first
- Review logs carefully
- Merge to main only after validation
- Document changes in CHANGELOG
Weekly:
- Check Docker Hub pull statistics
- Review workflow run logs
- Monitor image sizes
Monthly:
- Review and cleanup old tags
- Check security scan results
- Update dependencies if needed
Every 90 Days:
- Rotate Docker Hub access token
- Review security settings
- Audit access permissions
- GitHub Repository: https://github.com/adobe/OSCAL-Reports
- Full Documentation: https://github.com/adobe/OSCAL-Reports/tree/Development/docs
- Docker Hub Page: https://hub.docker.com/r/keekar/oscal_reports
- Check Documentation - Review this guide and related docs
- GitHub Actions Logs - Check workflow logs for errors
- Docker Hub Status - https://status.docker.com/
- GitHub Issues - Open an issue for problems
- Discussions - Join GitHub Discussions for questions
# Pull Commands
docker pull keekar/oscal_reports:latest # Stable
docker pull keekar/oscal_reports:edge # Development
docker pull keekar/oscal_reports:v1.6.3 # Specific version
# Run Commands
docker run -d --name oscal-app -p 3020:3020 keekar/oscal_reports:latest
docker run -d --name oscal-app -p 3020:3020 -v $(pwd)/config:/app/config keekar/oscal_reports:latest
# Management Commands
docker ps | grep oscal-app # Check status
docker logs oscal-app # View logs
docker logs -f oscal-app # Follow logs
docker stop oscal-app # Stop container
docker rm oscal-app # Remove container
curl http://localhost:3020/health # Check health| Resource | URL |
|---|---|
| Docker Hub | https://hub.docker.com/r/keekar/oscal_reports |
| Tags | https://hub.docker.com/r/keekar/oscal_reports/tags |
| GitHub Actions | https://github.com/adobe/OSCAL-Reports/actions |
| Issues | https://github.com/adobe/OSCAL-Reports/issues |
| Documentation | https://github.com/adobe/OSCAL-Reports/tree/Development/docs |
- TrueNAS / Blue-Green (Docker Hub +
install_from_dockerhub.sh) - Cloud Deployment
- Architecture
- Deployment Guide
Contributions are welcome. Visit the GitHub repository to report bugs, submit feature requests, contribute code via pull requests, or improve documentation.
This project is licensed under the MIT License. See LICENSE for details.
Mukesh Kesharwani – mukesh.kesharwani@adobe.com · @keekar2022
- Base image: node:24-alpine
- Build process: Multi-stage build for optimized size
- Platforms: linux/amd64, linux/arm64
- CI/CD: Automated builds via GitHub Actions
- Registry: Docker Hub (public)
Last Updated: April 2026
Maintained By: Mukesh Kesharwani
Version: 1.9.0