This comprehensive guide covers running GuardScan CLI in Docker across all major operating systems: Linux, macOS, and Windows.
- Overview
- Prerequisites
- Installation by OS
- Quick Start
- Docker Image Variants
- Usage Examples
- Environment Variables
- Volume Mounting Strategies
- Docker Compose Examples
- CI/CD Integration
- Troubleshooting
- Security Considerations
- Performance Optimization
- Advanced Scenarios
- Consistent Environment: Same behavior across different operating systems
- Isolation: No conflicts with local Node.js installations
- CI/CD Ready: Easy integration into automated pipelines
- Reproducibility: Same results every time
- Security: Isolated execution environment
- Portability: Run anywhere Docker runs
- Installation on Linux, macOS, and Windows
- Docker image selection and optimization
- OS-specific usage patterns
- Volume mounting strategies
- CI/CD pipeline integration
- Troubleshooting common issues
- Security best practices
- Docker Engine 20.10+ or Docker Desktop 4.0+
- Node.js 18+ (in container)
- 2GB+ RAM available for Docker
- Internet connection (for npm install and AI features)
- Docker Engine or Docker Desktop
- User in
dockergroup (for Docker Engine) - sudo access (for installation)
- Docker Desktop for Mac
- macOS 10.15+ (Catalina or later)
- For Apple Silicon (M1/M2): Docker Desktop with Rosetta 2 support
- Docker Desktop for Windows
- Windows 10/11 (64-bit) or Windows Server 2019+
- WSL2 enabled (recommended)
- Virtualization enabled in BIOS
Ubuntu/Debian:
# Remove old versions
sudo apt-get remove docker docker-engine docker.io containerd runc
# Update package index
sudo apt-get update
# Install prerequisites
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# Add Docker's official GPG key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Set up repository
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Install Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Add user to docker group (optional, for non-sudo usage)
sudo usermod -aG docker $USER
# Log out and back in for group changes to take effectCentOS/RHEL/Fedora:
# Install prerequisites
sudo yum install -y yum-utils
# Add Docker repository
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Install Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Start Docker
sudo systemctl start docker
sudo systemctl enable docker
# Add user to docker group
sudo usermod -aG docker $USERArch Linux:
# Install Docker
sudo pacman -S docker docker-compose
# Start Docker service
sudo systemctl start docker
sudo systemctl enable docker
# Add user to docker group
sudo usermod -aG docker $USERDocker Compose is included with Docker Desktop and Docker Engine 20.10+. For standalone installation:
# Download latest version
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# Make executable
sudo chmod +x /usr/local/bin/docker-compose
# Verify installation
docker-compose --version# Check Docker version
docker --version
# Test Docker installation
docker run hello-world
# Check Docker Compose
docker-compose --versionUsing Homebrew (Recommended):
# Install Docker Desktop
brew install --cask docker
# Start Docker Desktop
open /Applications/Docker.appManual Installation:
- Download Docker Desktop from docker.com/products/docker-desktop
- Open the
.dmgfile - Drag Docker to Applications folder
- Launch Docker Desktop from Applications
- Complete the setup wizard
- Docker Desktop for Apple Silicon includes native ARM support
- Most images work without issues
- For x86 images, Docker Desktop automatically uses Rosetta 2
- Performance may be slightly slower for x86 containers
Configure resources in Docker Desktop:
- Open Docker Desktop
- Go to Settings → Resources
- Recommended settings:
- CPUs: 2-4 cores
- Memory: 4-8 GB
- Swap: 1 GB
- Disk image size: 60+ GB
- Open Docker Desktop → Settings → Resources → File Sharing
- Add directories you want to mount:
/Users(default, includes your home directory)/Volumes(for external drives)- Custom project directories
# Check Docker version
docker --version
# Test Docker installation
docker run hello-world
# Check architecture (Apple Silicon)
docker info | grep ArchitectureUsing Chocolatey:
# Install Chocolatey if not installed
Set-ExecutionPolicy Bypass -Scope Process -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# Install Docker Desktop
choco install docker-desktop -yManual Installation:
- Download Docker Desktop from docker.com/products/docker-desktop
- Run the installer
- Enable WSL2 when prompted (recommended)
- Restart computer if required
- Launch Docker Desktop
WSL2 is recommended for better performance:
# Enable WSL2 (run as Administrator)
wsl --install
# Set WSL2 as default version
wsl --set-default-version 2
# Verify WSL2 installation
wsl --list --verboseDocker Desktop supports both Linux and Windows containers:
# Switch to Linux containers (default, recommended)
# Right-click Docker Desktop tray icon → Switch to Linux containers
# Or use command line
& "C:\Program Files\Docker\Docker\DockerCli.exe" -SwitchLinuxEngineWindows uses backslashes (\) but Docker containers use forward slashes (/):
# PowerShell - Use forward slashes or escape backslashes
docker run -v C:/Users/username/project:/workspace node:lts-alpine
# CMD - Use forward slashes
docker run -v C:/Users/username/project:/workspace node:lts-alpine
# WSL2 - Use Linux paths
docker run -v /mnt/c/Users/username/project:/workspace node:lts-alpine# Check Docker version
docker --version
# Test Docker installation
docker run hello-world
# Check WSL2 integration
docker info | Select-String "Operating System"Linux/macOS:
# Run GuardScan in a container
docker run --rm -v $(pwd):/workspace -w /workspace \
-e GUARDSCAN_HOME=/tmp/guardscan \
node:lts-alpine sh -c "
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev \
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git &&
npm install -g guardscan &&
guardscan init &&
guardscan security
"Windows (PowerShell):
# Run GuardScan in a container
docker run --rm -v ${PWD}:/workspace -w /workspace `
-e GUARDSCAN_HOME=/tmp/guardscan `
node:lts-alpine sh -c "
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git &&
npm install -g guardscan &&
guardscan init &&
guardscan security
"Windows (CMD):
docker run --rm -v %CD%:/workspace -w /workspace -e GUARDSCAN_HOME=/tmp/guardscan node:lts-alpine sh -c "apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git && npm install -g guardscan && guardscan init && guardscan security"| Image | Size | Compatibility | Use Case |
|---|---|---|---|
node:lts-alpine |
~50MB | High (musl libc) | Recommended - Production, CI/CD |
node:lts-slim |
~200MB | Very High (glibc) | Development, compatibility issues |
node:lts |
~900MB | Very High | Full Debian environment |
Advantages:
- Smallest image size
- Fast downloads and startup
- Lower memory footprint
- Suitable for most use cases
Considerations:
- Requires additional packages for some native modules
- Uses musl libc instead of glibc
Use when:
- Alpine has compatibility issues
- Need glibc compatibility
- Working with packages that don't support musl
Use when:
- Need full Debian environment
- Maximum compatibility required
- Size is not a concern
Quick Start:
# Install dependencies first
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev \
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git
# Install GuardScan
npm install -g guardscan
# Initialize
guardscan initCommon Issues & Solutions:
Symptoms:
Configuration not found. Run "guardscan init" first.
Cause: Alpine Linux containers may have issues with home directory detection.
Solutions:
-
Set GUARDSCAN_HOME environment variable:
export GUARDSCAN_HOME=/tmp/guardscan guardscan init -
Ensure HOME is set:
export HOME=/root # or appropriate directory guardscan init
-
Enable debug mode to see what's happening:
export GUARDSCAN_DEBUG=true guardscan init
Cause: Container may have restricted write permissions.
Solution: Use /tmp or a writeable volume:
export GUARDSCAN_HOME=/tmp/guardscan
# or mount a volume
docker run -v /path/on/host:/guardscan node:lts-alpine
export GUARDSCAN_HOME=/guardscanCause: Alpine uses musl instead of glibc and needs additional build tools.
Solution: Install all required dependencies:
apk add --no-cache \
python3 \
make \
g++ \
pkgconfig \
cairo-dev \
pango-dev \
libjpeg-turbo-dev \
giflib-dev \
pixman-dev \
freetype-dev \
build-base \
gitSymptoms:
Error: Cannot find module 'typescript'
TypeScript is required for AST parsing but not installed
Cause: TypeScript is a runtime dependency but may not be installed in Docker environments.
Solutions:
-
Verify TypeScript is installed after npm install:
docker run --rm node:lts-alpine sh -c " npm install -g guardscan node -e \"require('typescript'); console.log('TypeScript available')\" "
-
If TypeScript is missing, install it explicitly:
docker run --rm node:lts-alpine sh -c " npm install -g guardscan typescript guardscan --version "
-
Check package.json dependencies:
- TypeScript should be listed in
dependencies(notdevDependencies) - If using a custom build, ensure
npm installincludes all dependencies
- TypeScript should be listed in
Note: GuardScan now includes lazy loading and better error messages for missing dependencies. If you see a helpful error message with installation instructions, follow those instructions.
Docker Examples:
FROM node:lts-alpine
# Install dependencies
RUN apk add --no-cache \
python3 make g++ pkgconfig cairo-dev pango-dev \
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git
# Install GuardScan
RUN npm install -g guardscan
# Set up config location
ENV GUARDSCAN_HOME=/app/.guardscan
# Your code
WORKDIR /app
COPY . .
# Run GuardScan
RUN guardscan initFor enhanced security with read-only root:
docker run --read-only --tmpfs /tmp \
-e GUARDSCAN_HOME=/tmp/guardscan \
node:lts-alpine \
sh -c "npm install -g guardscan && guardscan init"Testing Your Setup:
Run the test script to verify GuardScan works in your environment:
cd cli
./test-alpine.shThis will test:
- ✅ Clean Alpine environment
- ✅ Missing HOME variable
- ✅ Custom GUARDSCAN_HOME
- ✅ Read-only filesystems
- ✅ Version check behavior
- ✅ Multiple commands in sequence
FROM node:lts-alpine
# Install only essential dependencies
RUN apk add --no-cache \
python3 \
make \
g++ \
git
# Install GuardScan
RUN npm install -g guardscan
# Set environment
ENV GUARDSCAN_HOME=/app/.guardscan
WORKDIR /app# Build stage
FROM node:lts-alpine AS builder
RUN apk add --no-cache \
python3 make g++ pkgconfig cairo-dev pango-dev \
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git
RUN npm install -g guardscan
# Runtime stage
FROM node:lts-alpine
# Copy only runtime dependencies
RUN apk add --no-cache \
python3 \
git
# Copy GuardScan from builder
COPY --from=builder /usr/local/lib/node_modules/guardscan /usr/local/lib/node_modules/guardscan
COPY --from=builder /usr/local/bin/guardscan /usr/local/bin/guardscan
ENV GUARDSCAN_HOME=/app/.guardscan
WORKDIR /appFROM node:lts-alpine
RUN apk add --no-cache \
python3 make g++ pkgconfig cairo-dev pango-dev \
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git
RUN npm install -g guardscan
ENV GUARDSCAN_HOME=/app/.guardscan
ENV GUARDSCAN_DEBUG=true
WORKDIR /app
# Mount source code as volume in docker-compose# Simple security scan
docker run --rm \
-v $(pwd):/workspace \
-w /workspace \
-e GUARDSCAN_HOME=/tmp/guardscan \
node:lts-alpine sh -c "
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev \
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git &&
npm install -g guardscan &&
guardscan security
"# Create named volume for config
docker volume create guardscan-config
# Use the volume
docker run --rm \
-v $(pwd):/workspace \
-v guardscan-config:/root/.guardscan \
-w /workspace \
node:lts-alpine sh -c "
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev \
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git &&
npm install -g guardscan &&
guardscan security
"Create /etc/systemd/system/guardscan.service:
[Unit]
Description=GuardScan Security Scanner
After=docker.service
Requires=docker.service
[Service]
Type=oneshot
ExecStart=/usr/bin/docker run --rm \
-v /path/to/project:/workspace \
-w /workspace \
-e GUARDSCAN_HOME=/tmp/guardscan \
node:lts-alpine sh -c "apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git && npm install -g guardscan && guardscan security"
RemainAfterExit=yes
[Install]
WantedBy=multi-user.targetEnable and run:
sudo systemctl enable guardscan.service
sudo systemctl start guardscan.serviceAdd to crontab (crontab -e):
# Run security scan daily at 2 AM
0 2 * * * docker run --rm -v /path/to/project:/workspace -w /workspace -e GUARDSCAN_HOME=/tmp/guardscan node:lts-alpine sh -c "apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git && npm install -g guardscan && guardscan security" >> /var/log/guardscan.log 2>&1# Simple security scan
docker run --rm \
-v $(pwd):/workspace \
-w /workspace \
-e GUARDSCAN_HOME=/tmp/guardscan \
node:lts-alpine sh -c "
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev \
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git &&
npm install -g guardscan &&
guardscan security
"# Mount macOS home directory
docker run --rm \
-v $(pwd):/workspace \
-v $HOME/.guardscan:/root/.guardscan \
-w /workspace \
-e GUARDSCAN_HOME=/root/.guardscan \
node:lts-alpine sh -c "
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev \
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git &&
npm install -g guardscan &&
guardscan security
"Create a wrapper script ~/bin/guardscan-docker:
#!/bin/bash
docker run --rm \
-v $(pwd):/workspace \
-v $HOME/.guardscan:/root/.guardscan \
-w /workspace \
-e GUARDSCAN_HOME=/root/.guardscan \
node:lts-alpine sh -c "
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev \
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git > /dev/null 2>&1 &&
npm install -g guardscan > /dev/null 2>&1 &&
guardscan $@
"Make executable:
chmod +x ~/bin/guardscan-dockerCreate guardscan-docker.ps1:
param(
[Parameter(ValueFromRemainingArguments=$true)]
[string[]]$CommandArgs
)
$workspace = (Get-Location).Path
$workspaceLinux = $workspace -replace '\\', '/' -replace 'C:', '/mnt/c'
docker run --rm `
-v "${workspace}:/workspace" `
-w /workspace `
-e GUARDSCAN_HOME=/tmp/guardscan `
node:lts-alpine sh -c "
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git &&
npm install -g guardscan &&
guardscan $($CommandArgs -join ' ')
"Usage:
.\guardscan-docker.ps1 security
.\guardscan-docker.ps1 scan --skip-testsCreate guardscan-docker.bat:
@echo off
setlocal
set WORKSPACE=%~dp0
set WORKSPACE=%WORKSPACE:~0,-1%
docker run --rm ^
-v "%WORKSPACE%:/workspace" ^
-w /workspace ^
-e GUARDSCAN_HOME=/tmp/guardscan ^
node:lts-alpine sh -c "apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git && npm install -g guardscan && guardscan %*"
endlocalUsage:
guardscan-docker.bat security
guardscan-docker.bat scan --skip-testsFrom WSL2 terminal:
# Navigate to Windows project (mounted at /mnt/c)
cd /mnt/c/Users/username/project
# Run GuardScan
docker run --rm \
-v $(pwd):/workspace \
-w /workspace \
-e GUARDSCAN_HOME=/tmp/guardscan \
node:lts-alpine sh -c "
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev \
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git &&
npm install -g guardscan &&
guardscan security
"Override the default home directory location.
export GUARDSCAN_HOME=/custom/pathDefault behavior:
- Tries
$GUARDSCAN_HOMEfirst - Falls back to
$HOME - Falls back to
$USERPROFILE(Windows) - Falls back to
os.homedir() - Last resort:
/tmp
Usage in Docker:
docker run -e GUARDSCAN_HOME=/tmp/guardscan node:lts-alpineEnable verbose debug logging to troubleshoot issues.
export GUARDSCAN_DEBUG=true
guardscan init # Will show detailed loggingUsage in Docker:
docker run -e GUARDSCAN_DEBUG=true node:lts-alpine guardscan initOverride the default backend API URL (for self-hosting or testing).
export GUARDSCAN_API_URL=https://custom-api.example.comDisable telemetry for the current command execution (set via --no-telemetry flag).
Note: This is handled via the --no-telemetry CLI flag, not an environment variable.
HOME- User home directoryUSER- Current usernameXDG_CONFIG_HOME- Config directory (if set, GuardScan uses$HOME/.guardscan)
HOME- User home directory (typically/Users/username)USER- Current username
USERPROFILE- User profile directory (typicallyC:\Users\username)APPDATA- Application data directoryLOCALAPPDATA- Local application data directory
# Create named volume
docker volume create guardscan-config
# Use the volume
docker run --rm \
-v guardscan-config:/root/.guardscan \
-v $(pwd):/workspace \
-w /workspace \
node:lts-alpine guardscan securityAdvantages:
- Persistent across container restarts
- Managed by Docker
- Can be backed up easily
Linux/macOS:
docker run --rm \
-v $HOME/.guardscan:/root/.guardscan \
-v $(pwd):/workspace \
-w /workspace \
node:lts-alpine guardscan securityWindows (PowerShell):
docker run --rm `
-v "$env:USERPROFILE\.guardscan:/root/.guardscan" `
-v "${PWD}:/workspace" `
-w /workspace `
node:lts-alpine guardscan securityAdvantages:
- Direct access to config files
- Easy to edit configuration
- Shares config with host system
docker run --rm \
-v guardscan-temp:/tmp/guardscan \
-e GUARDSCAN_HOME=/tmp/guardscan \
-v $(pwd):/workspace \
-w /workspace \
node:lts-alpine guardscan securityUse case: One-time scans, CI/CD pipelines
docker run --rm \
-v $(pwd):/workspace:ro \
-w /workspace \
-e GUARDSCAN_HOME=/tmp/guardscan \
node:lts-alpine guardscan securityAdvantages:
- Prevents accidental modifications
- Better security
- Suitable for production scans
docker run --rm \
-v $(pwd):/workspace \
-w /workspace \
-e GUARDSCAN_HOME=/tmp/guardscan \
node:lts-alpine guardscan securityUse case: When GuardScan needs to write reports or generate files
Create .dockerignore in your project root:
node_modules
dist
build
.git
.env
*.log
.DS_Store
Thumbs.db
This reduces the amount of data copied into the container.
version: '3.8'
services:
guardscan:
image: node:lts-alpine
environment:
- GUARDSCAN_HOME=/workspace/.guardscan
- GUARDSCAN_DEBUG=false
volumes:
- ./:/workspace
working_dir: /workspace
command: sh -c "
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git &&
npm install -g guardscan &&
guardscan scan
"Usage:
docker-compose upversion: '3.8'
services:
guardscan:
image: node:lts-alpine
environment:
- GUARDSCAN_HOME=/workspace/.guardscan
volumes:
- ./:/workspace
- guardscan-config:/root/.guardscan
working_dir: /workspace
command: sh -c "
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git &&
npm install -g guardscan &&
guardscan security
"
depends_on:
- postgres
postgres:
image: postgres:15-alpine
environment:
- POSTGRES_DB=guardscan
- POSTGRES_USER=guardscan
- POSTGRES_PASSWORD=secret
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
guardscan-config:
postgres-data:version: '3.8'
services:
guardscan:
build:
context: .
dockerfile: Dockerfile.dev
environment:
- GUARDSCAN_HOME=/app/.guardscan
- GUARDSCAN_DEBUG=true
volumes:
- ./:/app
- /app/node_modules
- guardscan-cache:/app/.guardscan/cache
working_dir: /app
command: guardscan security --watch
ports:
- "3000:3000" # If running a dev server
volumes:
guardscan-cache:name: GuardScan Security Check
on: [push, pull_request]
jobs:
security-scan:
runs-on: ubuntu-latest
container:
image: node:lts-alpine
steps:
- uses: actions/checkout@v3
- name: Install dependencies
run: |
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev \
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git
- name: Install GuardScan
run: npm install -g guardscan
- name: Run security scan
env:
GUARDSCAN_HOME: ${{ github.workspace }}/.guardscan
run: guardscan security
- name: Upload report
if: always()
uses: actions/upload-artifact@v3
with:
name: guardscan-report
path: guardscan-report.mdname: GuardScan macOS Check
on: [push, pull_request]
jobs:
security-scan:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- name: Install dependencies
run: |
brew install node
npm install -g guardscan
- name: Run security scan
env:
GUARDSCAN_HOME: ${{ github.workspace }}/.guardscan
run: guardscan securityname: GuardScan Windows Check
on: [push, pull_request]
jobs:
security-scan:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install GuardScan
run: npm install -g guardscan
- name: Run security scan
env:
GUARDSCAN_HOME: ${{ github.workspace }}\.guardscan
run: guardscan securityname: GuardScan Multi-OS
on: [push, pull_request]
jobs:
security-scan:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install GuardScan
run: npm install -g guardscan
- name: Run security scan
env:
GUARDSCAN_HOME: ${{ github.workspace }}/.guardscan
run: guardscan securitystages:
- security
guardscan:
stage: security
image: node:lts-alpine
before_script:
- apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git
- npm install -g guardscan
script:
- export GUARDSCAN_HOME=$CI_PROJECT_DIR/.guardscan
- guardscan security
artifacts:
paths:
- guardscan-report.md
expire_in: 1 weekpipeline {
agent {
docker {
image 'node:lts-alpine'
args '-e GUARDSCAN_HOME=/workspace/.guardscan'
}
}
stages {
stage('Security Scan') {
steps {
sh '''
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git
npm install -g guardscan
guardscan security
'''
}
}
}
post {
always {
archiveArtifacts artifacts: 'guardscan-report.md', fingerprint: true
}
}
}pipeline {
agent {
label 'windows'
}
stages {
stage('Security Scan') {
steps {
bat '''
npm install -g guardscan
set GUARDSCAN_HOME=%WORKSPACE%\.guardscan
guardscan security
'''
}
}
}
}trigger:
branches:
include:
- main
- develop
pool:
vmImage: 'ubuntu-latest'
steps:
- task: Docker@2
displayName: 'Run GuardScan'
inputs:
containerRegistry: ''
repository: 'node'
command: 'run'
arguments: '--rm -v $(System.DefaultWorkingDirectory):/workspace -w /workspace -e GUARDSCAN_HOME=/workspace/.guardscan node:lts-alpine sh -c "apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git && npm install -g guardscan && guardscan security"'version: 2.1
jobs:
security-scan:
docker:
- image: node:lts-alpine
steps:
- checkout
- run:
name: Install dependencies
command: |
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git
- run:
name: Install GuardScan
command: npm install -g guardscan
- run:
name: Run security scan
environment:
GUARDSCAN_HOME: /tmp/guardscan
command: guardscan security
- store_artifacts:
path: guardscan-report.mdProblem: permission denied when accessing files or directories.
Solutions:
-
Check file permissions:
ls -la /path/to/file chmod 755 /path/to/directory
-
Run with correct user:
docker run --user $(id -u):$(id -g) ...
-
Fix ownership:
sudo chown -R $USER:$USER /path/to/directory
Problem: SELinux blocking Docker access.
Solutions:
-
Set SELinux context:
chcon -Rt svirt_sandbox_file_t /path/to/directory
-
Disable SELinux for Docker (not recommended for production):
setsebool -P container_manage_cgroup on
Problem: AppArmor blocking container operations.
Solution: Create custom AppArmor profile or adjust Docker's AppArmor profile.
Problem: Container cannot reach internet.
Solutions:
-
Check Docker network:
docker network ls docker network inspect bridge
-
Use host network (Linux only):
docker run --network host ...
-
Check DNS:
docker run --rm node:lts-alpine nslookup google.com
Problem: Docker Desktop fails to start.
Solutions:
-
Restart Docker Desktop:
killall Docker && open /Applications/Docker.app -
Reset Docker Desktop:
- Docker Desktop → Troubleshoot → Reset to factory defaults
-
Check system requirements:
- macOS 10.15+ required
- Virtualization must be enabled
Problem: Container runs out of memory or CPU.
Solutions:
-
Increase resources in Docker Desktop:
- Settings → Resources → Advanced
- Increase Memory to 8GB+
- Increase CPUs to 4+
-
Check current usage:
docker stats
Problem: Cannot access mounted directories.
Solutions:
-
Add directory in Docker Desktop:
- Settings → Resources → File Sharing
- Add
/Users/username/project
-
Check directory permissions:
ls -la /Users/username/project chmod 755 /Users/username/project
Problem: Paths not resolving correctly.
Solutions:
-
Use absolute paths:
docker run -v /Users/username/project:/workspace ...
-
Check path format:
- Use forward slashes:
/Users/username/project - Not backslashes:
\Users\username\project
- Use forward slashes:
Problem: x86 images not working on Apple Silicon.
Solutions:
-
Use ARM images when available:
docker pull node:lts-alpine # Automatically pulls ARM version -
Enable Rosetta 2 (automatic in Docker Desktop):
- Docker Desktop handles x86 emulation automatically
Problem: WSL2 fails to start or initialize.
Solutions:
-
Enable WSL2:
# Run as Administrator wsl --install wsl --set-default-version 2
-
Update WSL2:
wsl --update -
Check WSL2 status:
wsl --status
Problem: Windows paths not working in Docker.
Solutions:
-
Use forward slashes:
docker run -v C:/Users/username/project:/workspace ...
-
Use WSL2 paths:
# From WSL2 docker run -v /mnt/c/Users/username/project:/workspace ... -
Convert paths in PowerShell:
$path = (Get-Location).Path -replace '\\', '/' docker run -v "${path}:/workspace" ...
Problem: Volumes fail to mount.
Solutions:
-
Enable file sharing in Docker Desktop:
- Settings → Resources → File Sharing
- Add
C:\Usersor specific project directory
-
Use WSL2 backend:
- Docker Desktop → Settings → General
- Enable "Use the WSL 2 based engine"
-
Check path format:
# Correct docker run -v C:/Users/username/project:/workspace ... # Incorrect docker run -v C:\Users\username\project:/workspace ...
Problem: Permission denied errors.
Solutions:
-
Run PowerShell as Administrator:
- Right-click PowerShell → Run as Administrator
-
Check file permissions:
icacls C:\Users\username\project
-
Grant permissions:
icacls C:\Users\username\project /grant Users:F
Problem: Scripts fail due to line ending differences.
Solutions:
-
Configure Git to use LF:
git config --global core.autocrlf false -
Convert files:
# Convert CRLF to LF (Get-Content file.sh -Raw) -replace "`r`n", "`n" | Set-Content file.sh -NoNewline
-
Use WSL2 for script execution:
# From WSL2 ./script.sh
Problem: Native modules fail to build.
Solution: Install all required build dependencies:
apk add --no-cache \
python3 \
make \
g++ \
pkgconfig \
cairo-dev \
pango-dev \
libjpeg-turbo-dev \
giflib-dev \
pixman-dev \
freetype-dev \
build-base \
gitProblem: GuardScan cannot find configuration.
Solutions:
-
Set GUARDSCAN_HOME:
export GUARDSCAN_HOME=/tmp/guardscan guardscan init -
Enable debug mode:
export GUARDSCAN_DEBUG=true guardscan init -
Check directory permissions:
mkdir -p /tmp/guardscan chmod 755 /tmp/guardscan
Problem: Container starts and exits right away.
Solutions:
-
Check logs:
docker logs <container-id>
-
Run interactively:
docker run -it node:lts-alpine sh
-
Check command syntax:
docker run --rm node:lts-alpine echo "test"
Problem: Container operations are slow.
Solutions:
-
Increase resources:
- Docker Desktop → Settings → Resources
- Increase CPU and Memory allocation
-
Use volume caching:
docker volume create guardscan-cache docker run -v guardscan-cache:/root/.guardscan/cache ...
-
Optimize Dockerfile:
- Use multi-stage builds
- Cache npm packages
- Minimize layers
Problem: Cannot reach external services.
Solutions:
-
Check DNS:
docker run --rm node:lts-alpine nslookup google.com
-
Test connectivity:
docker run --rm node:lts-alpine ping -c 3 8.8.8.8
-
Use host network (Linux only):
docker run --network host ...
FROM node:lts-alpine
# Create non-root user
RUN addgroup -g 1000 guardscan && \
adduser -D -u 1000 -G guardscan guardscan
# Switch to non-root user
USER guardscan
WORKDIR /appdocker run --read-only --tmpfs /tmp \
-e GUARDSCAN_HOME=/tmp/guardscan \
node:lts-alpine guardscan securitydocker run --memory="512m" --cpus="1.0" \
node:lts-alpine guardscan security# Disable network access
docker run --network none node:lts-alpine guardscan security
# Use custom network
docker network create guardscan-net
docker run --network guardscan-net node:lts-alpine guardscan security# ❌ Don't do this for secrets
docker run -e API_KEY=secret123 node:lts-alpineversion: '3.8'
services:
guardscan:
image: node:lts-alpine
secrets:
- api_key
environment:
- API_KEY_FILE=/run/secrets/api_key
secrets:
api_key:
external: true# Mount secret file
docker run -v ./secrets:/secrets:ro node:lts-alpine- Use minimal base images - Reduces attack surface
- Regular updates - Keep base images and dependencies updated
- Scan for vulnerabilities - Use
docker scanor Trivy - Least privilege - Run as non-root, minimal permissions
- No secrets in images - Use secrets management
- Read-only filesystems - When possible
- Resource limits - Prevent resource exhaustion
# Limit to 2 CPUs
docker run --cpus="2.0" node:lts-alpine guardscan security
# Limit CPU shares (relative)
docker run --cpu-shares=512 node:lts-alpine guardscan security# Limit to 1GB
docker run --memory="1g" node:lts-alpine guardscan security
# With swap
docker run --memory="1g" --memory-swap="2g" node:lts-alpine guardscan security# Limit I/O operations
docker run --device-read-bps /dev/sda:1mb \
--device-write-bps /dev/sda:1mb \
node:lts-alpine guardscan security# Order matters - put frequently changing layers last
FROM node:lts-alpine
# Install dependencies first (cached if unchanged)
RUN apk add --no-cache python3 make g++ git
# Install GuardScan (cached if version unchanged)
RUN npm install -g guardscan
# Copy code last (changes frequently)
COPY . /app# Create cache volume
docker volume create guardscan-npm-cache
# Use cache volume
docker run -v guardscan-npm-cache:/root/.npm \
node:lts-alpine guardscan security# Multi-stage build with layer caching
FROM node:lts-alpine AS deps
RUN apk add --no-cache python3 make g++ git
RUN npm install -g guardscan
FROM deps AS runtime
WORKDIR /app
COPY . .apiVersion: apps/v1
kind: Deployment
metadata:
name: guardscan
spec:
replicas: 1
selector:
matchLabels:
app: guardscan
template:
metadata:
labels:
app: guardscan
spec:
containers:
- name: guardscan
image: node:lts-alpine
command: ["sh", "-c"]
args:
- |
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git &&
npm install -g guardscan &&
guardscan security
env:
- name: GUARDSCAN_HOME
value: "/tmp/guardscan"
volumeMounts:
- name: workspace
mountPath: /workspace
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1000m"
volumes:
- name: workspace
emptyDir: {}apiVersion: v1
kind: ConfigMap
metadata:
name: guardscan-config
data:
GUARDSCAN_HOME: "/tmp/guardscan"
GUARDSCAN_DEBUG: "false"apiVersion: v1
kind: Secret
metadata:
name: guardscan-secrets
type: Opaque
stringData:
api-key: "your-api-key-here"version: '3.8'
services:
guardscan:
image: node:lts-alpine
environment:
- GUARDSCAN_HOME=/tmp/guardscan
volumes:
- workspace:/workspace
command: sh -c "
apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev
libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git &&
npm install -g guardscan &&
guardscan security
"
deploy:
replicas: 1
resources:
limits:
cpus: '1'
memory: 1G
reservations:
cpus: '0.5'
memory: 512M
volumes:
workspace:Deploy:
docker stack deploy -c docker-compose.yml guardscan{
"family": "guardscan",
"containerDefinitions": [
{
"name": "guardscan",
"image": "node:lts-alpine",
"environment": [
{
"name": "GUARDSCAN_HOME",
"value": "/tmp/guardscan"
}
],
"command": [
"sh", "-c",
"apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git && npm install -g guardscan && guardscan security"
],
"memory": 1024,
"cpu": 1024
}
]
}apiVersion: 2018-10-01
location: eastus
name: guardscan
properties:
containers:
- name: guardscan
properties:
image: node:lts-alpine
environmentVariables:
- name: GUARDSCAN_HOME
value: /tmp/guardscan
command:
- sh
- -c
- apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git && npm install -g guardscan && guardscan security
resources:
requests:
cpu: 1
memoryInGb: 1
osType: Linux
restartPolicy: NeverapiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: guardscan
spec:
template:
spec:
containers:
- image: node:lts-alpine
env:
- name: GUARDSCAN_HOME
value: /tmp/guardscan
command:
- sh
- -c
- apk add --no-cache python3 make g++ pkgconfig cairo-dev pango-dev libjpeg-turbo-dev giflib-dev pixman-dev freetype-dev build-base git && npm install -g guardscan && guardscan security
resources:
limits:
cpu: "1"
memory: 1Gi- Main README
- Getting Started Guide
- Alpine Linux Quick Reference
- Issue #25 - Alpine Linux Fix
- Docker Documentation
- Docker Compose Documentation
If you're still experiencing issues:
-
Enable debug mode:
# Using environment variable GUARDSCAN_DEBUG=true guardscan init 2>&1 | tee debug.log # Or using --debug flag (for security command) guardscan security --debug
-
Check home directory:
node -e "console.log(require('os').homedir())" -
Verify write permissions:
mkdir -p ~/.guardscan && echo "test" > ~/.guardscan/test.txt
-
Open an issue: GitHub Issues
- Include the debug log
- Mention your OS and Docker version
- Include your Dockerfile or docker-compose.yml if relevant
- Describe the exact error message
Last Updated: 2025-01-27