Docker Usage
sql-splitter works seamlessly in Docker containers for CI/CD pipelines and reproducible environments.
Quick Start
Section titled “Quick Start”Using Pre-built Image
Section titled “Using Pre-built Image”# Pull and run (when available on Docker Hub)docker run --rm -v $(pwd):/data sql-splitter split /data/dump.sql -o /data/tables/Building Locally
Section titled “Building Locally”# Clone and buildgit clone https://github.com/helgesverre/sql-splittercd sql-splitter
# Build optimized imagedocker build -t sql-splitter -f - . <<'EOF'FROM rust:1.75-slim AS builderWORKDIR /appCOPY . .RUN cargo build --release
FROM debian:bookworm-slimCOPY --from=builder /app/target/release/sql-splitter /usr/local/bin/ENTRYPOINT ["sql-splitter"]EOF
# Rundocker run --rm -v $(pwd):/data sql-splitter analyze /data/dump.sqlCI/CD Examples
Section titled “CI/CD Examples”name: Validate SQL Dumps
on: push: paths: - 'migrations/*.sql'
jobs: validate: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- name: Install sql-splitter run: cargo install sql-splitter
- name: Validate migrations run: sql-splitter validate "migrations/*.sql" --strict
- name: Check for breaking changes run: | sql-splitter diff migrations/prev.sql migrations/current.sql \ --format json > diff.json if jq -e '.schema.tables_removed | length > 0' diff.json; then echo "Breaking change: tables removed" exit 1 fivalidate-sql: image: rust:1.75-slim before_script: - cargo install sql-splitter script: - sql-splitter validate "dumps/*.sql" --strict --json > validation.json artifacts: paths: - validation.json when: alwaysversion: 2.1
jobs: validate: docker: - image: rust:1.75-slim steps: - checkout - run: name: Install sql-splitter command: cargo install sql-splitter - run: name: Validate SQL dumps command: sql-splitter validate "*.sql" --strictDocker Compose
Section titled “Docker Compose”Development Database Seeding
Section titled “Development Database Seeding”version: "3.8"
services: db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: app volumes: - ./init:/docker-entrypoint-initdb.d healthcheck: test: mysqladmin ping -h localhost interval: 5s timeout: 5s retries: 10
seed: image: rust:1.75-slim depends_on: db: condition: service_healthy volumes: - ./dumps:/data command: > sh -c " cargo install sql-splitter && sql-splitter sample /data/prod.sql.gz \ --percent 10 \ --preserve-relations \ -o /data/dev.sql && sql-splitter redact /data/dev.sql \ --hash '*.email' \ --fake '*.name' \ -o /data/safe.sql "Multi-Tenant Extraction
Section titled “Multi-Tenant Extraction”# Extract tenant data for isolated testingservices: extract-tenant: build: context: . dockerfile: Dockerfile.sql-splitter volumes: - ./dumps:/data command: > shard /data/prod.sql --tenant-column company_id --tenant-values "1,2,3" -o /data/tenants/Dockerfile Best Practices
Section titled “Dockerfile Best Practices”Multi-stage Build (Smallest Image)
Section titled “Multi-stage Build (Smallest Image)”# Build stageFROM rust:1.75-slim AS builderWORKDIR /appRUN apt-get update && apt-get install -y pkg-config libssl-devCOPY . .RUN cargo build --release
# Runtime stageFROM debian:bookworm-slimRUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*COPY --from=builder /app/target/release/sql-splitter /usr/local/bin/ENTRYPOINT ["sql-splitter"]With Shell for Piping
Section titled “With Shell for Piping”FROM debian:bookworm-slimRUN apt-get update && \ apt-get install -y ca-certificates curl && \ rm -rf /var/lib/apt/lists/*
# Install from GitHub releasesRUN curl -L https://github.com/helgesverre/sql-splitter/releases/latest/download/sql-splitter-linux-amd64.tar.gz | \ tar xz -C /usr/local/bin/
# Use shell entrypoint for piping supportENTRYPOINT ["/bin/sh", "-c"]Volume Mounting
Section titled “Volume Mounting”Read-Only Input
Section titled “Read-Only Input”# Mount input as read-only, output as read-writedocker run --rm \ -v $(pwd)/input:/input:ro \ -v $(pwd)/output:/output \ sql-splitter split /input/dump.sql -o /output/tables/Working with Compressed Files
Section titled “Working with Compressed Files”# Process compressed files (sql-splitter handles .gz, .bz2, .xz, .zst)docker run --rm \ -v $(pwd):/data \ sql-splitter analyze /data/backup.sql.gz --progressPerformance Tips
Section titled “Performance Tips”Use Native CPU Features
Section titled “Use Native CPU Features”When building for your specific architecture:
FROM rust:1.75-slim AS builderWORKDIR /appCOPY . .ENV RUSTFLAGS="-C target-cpu=native"RUN cargo build --releaseMemory Limits
Section titled “Memory Limits”sql-splitter uses ~50MB constant memory regardless of file size, so you can set conservative limits:
docker run --rm \ --memory=256m \ -v $(pwd):/data \ sql-splitter split /data/huge.sql.gz -o /data/tables/Parallel Processing
Section titled “Parallel Processing”For many files, run multiple containers:
# Process files in parallel using GNU parallelfind dumps -name '*.sql.gz' | \ parallel -j4 docker run --rm -v $(pwd):/data sql-splitter validate /data/{}Troubleshooting
Section titled “Troubleshooting”Permission Denied
Section titled “Permission Denied”# Run as current userdocker run --rm \ --user $(id -u):$(id -g) \ -v $(pwd):/data \ sql-splitter split /data/dump.sql -o /data/output/File Not Found
Section titled “File Not Found”# Ensure absolute paths inside containerdocker run --rm \ -v /absolute/path/to/dumps:/data \ sql-splitter analyze /data/dump.sqlSee Also
Section titled “See Also”- CI Validation - Automated validation workflows
- Compression - Supported compression formats
- Performance - Optimization tips