PostgreSQL Docker Instance Manager CLI. Create, manage, and backup PostgreSQL instances with automatic credential generation, health monitoring, and cross-platform support.
Project description
PgDock - PostgreSQL Docker Instance Manager
A CLI tool for managing PostgreSQL Docker instances with automatic credential generation, health checking, and backup capabilities.
Features
- Easy Instance Management: Create, start, stop, and destroy PostgreSQL instances with simple commands
- Automatic Setup: Generates secure credentials, picks free ports, and handles Docker Compose configuration
- Health Monitoring: Built-in health checks with timeout handling
- Backup & Restore: Built-in backup functionality with retention policies
- Multiple Formats: Human-readable output and JSON support
- Cross-Platform: Works on macOS and Ubuntu with Docker Desktop or Docker Engine
Installation
Via pip (recommended)
pip install pgdock
Development Installation
git clone https://github.com/matija2209/pgdock.git
cd pgdock
pip install -e .
WSL/Linux PATH Setup
If pgdock command is not found after installation, add the user bin directory to your PATH:
# Add to PATH temporarily
export PATH="$HOME/.local/bin:$PATH"
# Make it permanent (choose your shell)
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc # for bash
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc # for zsh
# Reload your shell configuration
source ~/.bashrc # or source ~/.zshrc
Requirements
- Python 3.10+
- Docker Engine (Ubuntu) or Docker Desktop (macOS)
- Docker Compose v2 (or legacy docker-compose)
Quick Start
Create a New Instance
# Create with auto-generated name and credentials
pgdock create
# Create with custom name
pgdock create --name mydb
# Create with specific version and port
pgdock create --name mydb --version 16 --port 5433
Connect to Your Database
# Get connection details
pgdock creds mydb
# Get connection string in JSON format
pgdock creds mydb --json
# Copy connection string to clipboard
pgdock creds mydb --copy
# Connect with psql using the connection string
psql "$(pgdock creds mydb --json | jq -r .connectionString)"
List All Instances
pgdock list
Check Instance Status
pgdock status mydb
Command Reference
pgdock create
Create and start a new PostgreSQL instance.
pgdock create [OPTIONS]
Options:
--name TEXT: Instance name (auto-generated if not provided)--version TEXT: PostgreSQL version (default: "latest")--db-name TEXT: Database name (defaults to instance name)--user TEXT: Database user (auto-generated if not provided)--password TEXT: Database password (auto-generated if not provided)--port INTEGER: Host port (auto-picked if not provided)--wait/--no-wait: Wait for container to be healthy (default: --wait)--json-out PATH: Save credentials to JSON file--no-pgpass: Skip updating ~/.pgpass--timeout INTEGER: Health check timeout in seconds (default: 90)--copy: Copy connection string to clipboard
Example:
pgdock create --name myapp --version 15 --port 5433 --copy
pgdock list
List all PostgreSQL instances with their status.
pgdock list
pgdock status
Show detailed status of a PostgreSQL instance.
pgdock status INSTANCE_NAME
pgdock creds
Show credentials for a PostgreSQL instance.
pgdock creds INSTANCE_NAME [OPTIONS]
Options:
--json: Output in JSON format--copy: Copy connection string to clipboard
pgdock start/stop
Start or stop a PostgreSQL instance.
pgdock start INSTANCE_NAME
pgdock stop INSTANCE_NAME
pgdock destroy
Destroy a PostgreSQL instance.
pgdock destroy INSTANCE_NAME [OPTIONS]
Options:
--purge-volume: Also remove the data volume--remove-config: Also remove instance configuration files--force: Skip confirmation prompts
pgdock backup
Create a backup of a PostgreSQL instance.
pgdock backup INSTANCE_NAME DEST_DIR [OPTIONS]
Options:
--format TEXT: Backup format: "sql" or "custom" (default: "sql")--retention-days INTEGER: Delete backups older than N days--json: Output result in JSON format
Example:
pgdock backup mydb ./backups --format custom --retention-days 30
pgdock logs
Show logs for a PostgreSQL instance.
pgdock logs INSTANCE_NAME [OPTIONS]
Options:
--follow, -f: Follow log output--lines, -n INTEGER: Number of lines to show
Configuration
Environment Variables
PGDOCK_HOME: Override default home directory (~/.pgdock)
Instance Storage
pgdock stores instance configurations in ~/.pgdock/instances/. Each instance has:
compose.yml: Docker Compose configurationmetadata.json: Instance metadata and credentials
PostgreSQL Credentials
- Automatic ~/.pgpass Updates: pgdock automatically updates your
~/.pgpassfile - Secure Generation: Passwords are 20 characters with URL-safe characters
- Username Pattern:
u_<8_random_chars>
Backup and Retention
pgdock includes built-in backup functionality:
# Create SQL backup
pgdock backup mydb /path/to/backups
# Create custom format backup with retention
pgdock backup mydb /path/to/backups --format custom --retention-days 7
# JSON output for scripting
pgdock backup mydb /path/to/backups --json
Backup Filename Format: {instance_name}_{YYYYMMDD_HHMMSS}.{ext}
Retention Policy: Automatically deletes backups older than specified days, only affecting files matching the instance name pattern.
Troubleshooting
Command Not Found (WSL/Linux)
If pgdock command is not found after installation:
# Check if ~/.local/bin is in your PATH
echo $PATH | grep -q "$HOME/.local/bin" && echo "✓ In PATH" || echo "✗ Not in PATH"
# Add to PATH temporarily
export PATH="$HOME/.local/bin:$PATH"
# Make it permanent
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc # bash
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc # zsh
# Reload shell
source ~/.bashrc # or source ~/.zshrc
Docker Permission Issues (Linux)
If you get "Docker daemon not running or not accessible" error on Linux:
# Add your user to the docker group
sudo usermod -aG docker $USER
# Apply the group change (requires re-login or newgrp)
newgrp docker
# Verify Docker access
docker info
# Now pgdock should work
pgdock create --name test
Note: You may need to log out and back in for group changes to take effect.
Docker Compose Version Issues
pgdock requires Docker Compose v2. If you get compose-related errors:
# Check your Docker Compose version
docker compose version
# If you only have legacy docker-compose, upgrade Docker Desktop or install Compose v2:
# For Ubuntu/Debian:
sudo apt-get update
sudo apt-get install docker-compose-plugin
# For other systems, follow: https://docs.docker.com/compose/install/
pgdock supports both docker compose (v2, recommended) and docker-compose (legacy, with warning).
WSL Networking
If you need to access pgdock instances from outside WSL:
# In Windows PowerShell (as Administrator)
# Replace 172.27.16.146 with your WSL IP (get it with: wsl hostname -I)
netsh interface portproxy add v4tov4 listenport=5400 listenaddress=0.0.0.0 connectport=5400 connectaddress=172.27.16.146
# List current port forwards
netsh interface portproxy show v4tov4
# Remove port forward when no longer needed
netsh interface portproxy delete v4tov4 listenport=5400 listenaddress=0.0.0.0
Port Conflicts
pgdock automatically finds free ports starting from 5400. To use a specific port:
pgdock create --port 5433
Health Check Timeouts
If instances fail to start:
- Check Docker container logs:
pgdock logs instance_name - Verify port availability
- Check Docker daemon status
- Increase timeout:
pgdock create --timeout 120
Docker Compose Version
pgdock supports both:
docker compose(v2, recommended)docker-compose(legacy, with warning)
Migration from Manual Docker Setup
If you're migrating from a manual Docker Compose setup to pgdock:
-
Stop existing containers:
docker compose down
-
Install pgdock:
pip install pgdock
-
Create new managed instance:
pgdock create --name mydb --port 5432
-
Migrate data (if needed):
# Export from old container docker exec old_container pg_dump -U user dbname > backup.sql # Import to new instance psql "$(pgdock creds mydb --json | jq -r .connectionString)" < backup.sql
Testing Your Instance
After creating a pgdock instance, verify it's working correctly:
Quick Connection Test
# Get connection details
pgdock creds mydb
# Test connection with psql (remove ?schema=public if you get URI errors)
psql "postgresql://user:password@localhost:port/database" -c "SELECT version();"
# Or use the JSON output to get connection string
CONNECTION_STRING=$(pgdock creds mydb --json | jq -r .connectionString | sed 's/?schema=public//')
psql "$CONNECTION_STRING" -c "SELECT version();"
Comprehensive Instance Test
# 1. Check instance status
pgdock status mydb
# 2. Test database connection
pgdock creds mydb --json | jq -r .connectionString | sed 's/?schema=public//' | xargs -I {} psql {} -c "SELECT current_database(), current_user, version();"
# 3. Create a test table and insert data
CONNECTION_STRING=$(pgdock creds mydb --json | jq -r .connectionString | sed 's/?schema=public//')
psql "$CONNECTION_STRING" << EOF
CREATE TABLE test_table (id SERIAL PRIMARY KEY, name TEXT, created_at TIMESTAMP DEFAULT NOW());
INSERT INTO test_table (name) VALUES ('pgdock test'), ('connection verified');
SELECT * FROM test_table;
DROP TABLE test_table;
EOF
# 4. Test backup functionality
mkdir -p ./test-backups
pgdock backup mydb ./test-backups --format sql
ls -la ./test-backups/
# 5. Check container logs
pgdock logs mydb --lines 20
External Access Testing
If you need external access (VPS, cloud instance):
# Test from another machine (replace with your server IP)
psql "postgresql://user:password@YOUR_SERVER_IP:5400/database" -c "SELECT version();"
# Example with actual values:
psql "postgresql://u_56ocdyl4:TbCnRR9UiI0SBROW7O1C@23.88.102.236:5400/pg_smart_wolf" -c "SELECT version();"
Expected Output:
version
-----------------------------------------------------------------------------
PostgreSQL 17.5 (Debian 17.5-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
(1 row)
Testing Network Connectivity
# Test port connectivity
telnet localhost 5400 # or your server IP
# Check if port is open
nmap -p 5400 localhost # or your server IP
# For Docker containers, check port mapping
docker port pgdock-mydb
Examples
Development Workflow
# Create a development database
pgdock create --name devdb --version 15
# Get connection details for your app
pgdock creds devdb --json
# Check if it's running
pgdock status devdb
# Create a backup before making changes
pgdock backup devdb ./backups
# View recent logs
pgdock logs devdb --lines 50
# Stop when done
pgdock stop devdb
Production-like Setup
# Create production-like instance
pgdock create --name proddb --version 16 --port 5432
# Create daily backups with retention
pgdock backup proddb /var/backups/postgres --retention-days 30
# Monitor health
pgdock status proddb
Multiple Instances
# Create multiple versions for testing
pgdock create --name test-pg14 --version 14
pgdock create --name test-pg15 --version 15
pgdock create --name test-pg16 --version 16
# List all instances
pgdock list
# Connect to specific version
psql "$(pgdock creds test-pg15 --json | jq -r .connectionString)"
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
License
[License Type] - see LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pgdock-1.0.0.tar.gz.
File metadata
- Download URL: pgdock-1.0.0.tar.gz
- Upload date:
- Size: 19.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cee5ca350e7e2e9ce9b454256dbbc8a0b724e94ba0613c2de5a697800513638a
|
|
| MD5 |
6e5a0c0564f833d83fcbda222f74a847
|
|
| BLAKE2b-256 |
9450cecfb5d241aaf3542eed629643c3b7c75412bd4024b4b1828628f4599ef9
|
Provenance
The following attestation bundles were made for pgdock-1.0.0.tar.gz:
Publisher:
pypi-publish.yml on matija2209/pgdock
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pgdock-1.0.0.tar.gz -
Subject digest:
cee5ca350e7e2e9ce9b454256dbbc8a0b724e94ba0613c2de5a697800513638a - Sigstore transparency entry: 385242664
- Sigstore integration time:
-
Permalink:
matija2209/pgdock@df5473e693d6d8aff006c531e0a86a283048353a -
Branch / Tag:
refs/tags/v1.0.3 - Owner: https://github.com/matija2209
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@df5473e693d6d8aff006c531e0a86a283048353a -
Trigger Event:
release
-
Statement type:
File details
Details for the file pgdock-1.0.0-py3-none-any.whl.
File metadata
- Download URL: pgdock-1.0.0-py3-none-any.whl
- Upload date:
- Size: 15.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32866e4de6201b71c777408f68560af8a058a3d4acab4182623922b88c9fbd80
|
|
| MD5 |
2c6c9f474e488716d3d8aafd3d6a63af
|
|
| BLAKE2b-256 |
b712dcdb21d390e5a54059c5c3b3afeb8473ce2ddb073e2916bfd53c1efc1fff
|
Provenance
The following attestation bundles were made for pgdock-1.0.0-py3-none-any.whl:
Publisher:
pypi-publish.yml on matija2209/pgdock
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pgdock-1.0.0-py3-none-any.whl -
Subject digest:
32866e4de6201b71c777408f68560af8a058a3d4acab4182623922b88c9fbd80 - Sigstore transparency entry: 385242681
- Sigstore integration time:
-
Permalink:
matija2209/pgdock@df5473e693d6d8aff006c531e0a86a283048353a -
Branch / Tag:
refs/tags/v1.0.3 - Owner: https://github.com/matija2209
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@df5473e693d6d8aff006c531e0a86a283048353a -
Trigger Event:
release
-
Statement type: