- 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
4.9 KiB
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 hostPGPORT- Database port (default: 5432)PGUSER- Database userPGPASSWORD- Database passwordPGDATABASE- Database name
MySQL/MariaDB:
MYSQL_HOST- Database hostMYSQL_PORT- Database port (default: 3306)MYSQL_USER- Database userMYSQL_PWD- Database passwordMYSQL_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