Files
dbbackup/DOCKER.md
Renz 6e04db4a98 feat: Add Docker support for easy distribution
- Multi-stage Dockerfile for minimal image size (~119MB)
- Includes PostgreSQL, MySQL, MariaDB client tools
- Non-root user (UID 1000) for security
- Docker Compose examples for all use cases
- Complete Docker documentation (DOCKER.md)
- Kubernetes CronJob examples
- Support for Docker secrets
- Multi-platform build support

Docker makes deployment trivial:
- No dependency installation needed
- Consistent environment
- Easy CI/CD integration
- Kubernetes-ready
2025-11-25 18:33:34 +00:00

4.9 KiB

Docker Usage Guide

Quick Start

Build Image

docker build -t dbbackup:latest .

Run Container

PostgreSQL Backup:

docker run --rm \
  -v $(pwd)/backups:/backups \
  -e PGHOST=your-postgres-host \
  -e PGUSER=postgres \
  -e PGPASSWORD=secret \
  dbbackup:latest backup single mydb

MySQL Backup:

docker run --rm \
  -v $(pwd)/backups:/backups \
  -e MYSQL_HOST=your-mysql-host \
  -e MYSQL_USER=root \
  -e MYSQL_PWD=secret \
  dbbackup:latest backup single mydb --db-type mysql

Interactive Mode:

docker run --rm -it \
  -v $(pwd)/backups:/backups \
  -e PGHOST=your-postgres-host \
  -e PGUSER=postgres \
  -e PGPASSWORD=secret \
  dbbackup:latest interactive

Docker Compose

Start Test Environment

# Start test databases
docker-compose up -d postgres mysql

# Wait for databases to be ready
sleep 10

# Run backup
docker-compose run --rm postgres-backup

Interactive Mode

docker-compose run --rm dbbackup-interactive

Scheduled Backups with Cron

Create docker-cron:

#!/bin/bash
# Daily PostgreSQL backup at 2 AM
0 2 * * * docker run --rm -v /backups:/backups -e PGHOST=postgres -e PGUSER=postgres -e PGPASSWORD=secret dbbackup:latest backup single production_db

Environment Variables

PostgreSQL:

  • PGHOST - Database host
  • PGPORT - Database port (default: 5432)
  • PGUSER - Database user
  • PGPASSWORD - Database password
  • PGDATABASE - Database name

MySQL/MariaDB:

  • MYSQL_HOST - Database host
  • MYSQL_PORT - Database port (default: 3306)
  • MYSQL_USER - Database user
  • MYSQL_PWD - Database password
  • MYSQL_DATABASE - Database name

General:

  • BACKUP_DIR - Backup directory (default: /backups)
  • COMPRESS_LEVEL - Compression level 0-9 (default: 6)

Volume Mounts

docker run --rm \
  -v /host/backups:/backups \              # Backup storage
  -v /host/config/.dbbackup.conf:/home/dbbackup/.dbbackup.conf:ro \  # Config file
  dbbackup:latest backup single mydb

Docker Hub

Pull pre-built image (when published):

docker pull uuxo/dbbackup:latest
docker pull uuxo/dbbackup:1.0

Kubernetes Deployment

CronJob Example:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: postgres-backup
spec:
  schedule: "0 2 * * *"  # Daily at 2 AM
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: dbbackup
            image: dbbackup:latest
            args: ["backup", "single", "production_db"]
            env:
            - name: PGHOST
              value: "postgres.default.svc.cluster.local"
            - name: PGUSER
              value: "postgres"
            - name: PGPASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgres-secret
                  key: password
            volumeMounts:
            - name: backups
              mountPath: /backups
          volumes:
          - name: backups
            persistentVolumeClaim:
              claimName: backup-storage
          restartPolicy: OnFailure

Docker Secrets

Using Docker Secrets:

# Create secrets
echo "mypassword" | docker secret create db_password -

# Use in stack
docker stack deploy -c docker-stack.yml dbbackup

docker-stack.yml:

version: '3.8'
services:
  backup:
    image: dbbackup:latest
    secrets:
      - db_password
    environment:
      - PGHOST=postgres
      - PGUSER=postgres
      - PGPASSWORD_FILE=/run/secrets/db_password
    command: backup single mydb
    volumes:
      - backups:/backups

secrets:
  db_password:
    external: true

volumes:
  backups:

Image Size

Multi-stage build results:

  • Builder stage: ~500MB (Go + dependencies)
  • Final image: ~100MB (Alpine + clients)
  • Binary only: ~15MB

Security

Non-root user:

  • Runs as UID 1000 (dbbackup user)
  • No privileged operations needed
  • Read-only config mount recommended

Network:

# Use custom network
docker network create dbnet

docker run --rm \
  --network dbnet \
  -v $(pwd)/backups:/backups \
  dbbackup:latest backup single mydb

Troubleshooting

Check logs:

docker logs dbbackup-postgres

Debug mode:

docker run --rm -it \
  -v $(pwd)/backups:/backups \
  dbbackup:latest backup single mydb --debug

Shell access:

docker run --rm -it --entrypoint /bin/sh dbbackup:latest

Building for Multiple Platforms

# Enable buildx
docker buildx create --use

# Build multi-arch
docker buildx build \
  --platform linux/amd64,linux/arm64,linux/arm/v7 \
  -t uuxo/dbbackup:latest \
  --push .

Registry Push

# Tag for registry
docker tag dbbackup:latest git.uuxo.net/uuxo/dbbackup:latest
docker tag dbbackup:latest git.uuxo.net/uuxo/dbbackup:1.0

# Push to private registry
docker push git.uuxo.net/uuxo/dbbackup:latest
docker push git.uuxo.net/uuxo/dbbackup:1.0