A production-ready Docker Compose configuration for running PostgreSQL 18 (Alpine variant) with persistent storage and fully configurable environment variables.
- π PostgreSQL 18 Alpine - Lightweight and secure Alpine-based image
- π§ Fully Configurable - All settings via environment variables
- πΎ Persistent Storage - Docker volume for data persistence
- π₯ Health Checks - Built-in health monitoring
- π Secure - Environment-based credential management
- π Production Ready - Restart policies and network isolation
- Docker Engine 20.10+ or Docker Desktop
- Docker Compose 2.0+ (or docker compose plugin)
-
Clone the repository
git clone https://github.com/talitm555/postgres-18-docker.git cd postgres-18-docker -
Create your environment file
cp env.sample .env
-
Configure your settings
Edit
.envfile with your desired configuration:nano .env # or use your preferred editorUpdate at minimum:
POSTGRES_DB- Your database namePOSTGRES_USER- Database userPOSTGRES_PASSWORD- Strong password (change from default!)
-
Start PostgreSQL
docker-compose up -d
-
Verify it's running
docker-compose ps docker-compose logs postgres
All configuration is done through environment variables in the .env file. See env.sample for all available options:
| Variable | Description | Default |
|---|---|---|
POSTGRES_DB |
Database name | myapp |
POSTGRES_USER |
Database user | postgres |
POSTGRES_PASSWORD |
Database password | changeme |
POSTGRES_PORT |
Host port mapping | 5432 |
POSTGRES_CONTAINER_NAME- Custom container namePOSTGRES_DATA_PATH- Volume mount path in containerPOSTGRES_VOLUME_NAME- Docker volume namePOSTGRES_NETWORK_NAME- Docker network namePOSTGRES_INITDB_ARGS- Additional initdb arguments
docker-compose up -ddocker-compose downdocker-compose down -vdocker-compose logs -f postgresUsing psql:
docker-compose exec postgres psql -U postgres -d myappOr from your host machine:
psql -h localhost -p 5432 -U postgres -d myappdocker-compose exec postgres pg_dump -U postgres myapp > backup.sqldocker-compose exec -T postgres psql -U postgres myapp < backup.sqlData is stored in a Docker volume named postgres_data (configurable via POSTGRES_VOLUME_NAME). This ensures your data persists across container restarts and updates.
List volumes:
docker volume lsInspect volume:
docker volume inspect postgres_dataBackup volume data:
docker run --rm -v postgres_data:/data -v $(pwd):/backup alpine tar czf /backup/postgres_backup.tar.gz /dataThe container includes a health check that verifies PostgreSQL is ready to accept connections. Check status:
docker-compose psThe PostgreSQL container runs on an isolated Docker network (postgres_network by default). To connect other containers to the same network:
networks:
- postgres_network- Change default credentials - Always update
POSTGRES_PASSWORDin.env - Use strong passwords - Generate secure passwords for production
- Restrict port access - Only expose port 5432 if necessary
- Keep
.envprivate - Never commit.envto version control (already in.gitignore) - Regular updates - Keep the PostgreSQL image updated
If you encounter permission errors, remove the existing volume and start fresh:
docker-compose down -v
docker-compose up -dIf port 5432 is already in use, change POSTGRES_PORT in your .env file:
POSTGRES_PORT=5433Check the logs for errors:
docker-compose logs postgresTo completely reset (
docker-compose down -v
rm .env
cp env.sample .env
# Edit .env with your settings
docker-compose up -dTo upgrade PostgreSQL to a newer version:
- Backup your data
- Update the image tag in
docker-compose.yml - Run:
docker-compose pull docker-compose up -d
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License - see the LICENSE file for details.
- π Report Issues
- π‘ Request Features
- π PostgreSQL Documentation