How to Set Up the Intermediate Bootcamp Database Environment with Docker
Clone the DataExpert-io/data-engineer-handbook repository, copy example.env to .env, and run make up or docker compose up -d to start PostgreSQL and PGAdmin containers with pre-loaded sample data.
The DataExpert-io/data-engineer-handbook intermediate bootcamp provides a containerized database environment for hands-on data modeling labs. This guide walks through setting up the intermediate bootcamp database environment with Docker using the official Docker Compose configuration from the repository.
Architecture Overview
The bootcamp uses Docker Compose to orchestrate two services defined in docker-compose.yml:
- PostgreSQL 14 (
postgres:14) – Stores the sample schema and data for dimensional modeling exercises - PGAdmin 4 (
dpage/pgadmin4) – Web-based administration interface for querying and exploring the database
Key implementation details from intermediate-bootcamp/materials/1-dimensional-data-modeling/docker-compose.yml:
- Environment variables load from an
.envfile (based onexample.env) - The repository root mounts at
/bootcamp/inside containers - A
data.dumpfile auto-imports into PostgreSQL on first startup via/docker-entrypoint-initdb.d/ - Named volumes (
postgres-data,pgadmin-data) persist state across restarts
Prerequisites
Before starting, ensure you have:
- Docker Engine 20.10+ and Docker Compose v2+
- Git for cloning the repository
- Approximately 2 GB free disk space for images and data
Step-by-Step Setup
1. Clone the Repository
git clone https://github.com/DataExpert-io/data-engineer-handbook.git
cd data-engineer-handbook/intermediate-bootcamp/materials/1-dimensional-data-modeling
2. Configure Environment Variables
The example.env file in this directory contains default credentials. Copy it to .env:
cp example.env .env
Edit .env if you need custom ports or credentials. The defaults use:
- PostgreSQL user/password:
postgres/postgres - PGAdmin email/password:
postgres@postgres.com/postgres
3. Start the Services
macOS/Linux (recommended):
make up
All platforms:
docker compose up -d
Both commands start containers in detached mode. The Makefile simply wraps Docker Compose with convenient targets.
4. Verify Container Status
docker ps -a
Expected output shows two running containers:
my-postgres-container(PostgreSQL)pgadmin(PGAdmin web UI)
5. Access PGAdmin and Connect to PostgreSQL
- Open
http://localhost:5050in your browser - Log in with credentials from
.env(default:postgres@postgres.com/postgres) - Add a new server with these settings:
- Name: Any identifier (e.g., "Bootcamp DB")
- Host:
my-postgres-container - Port:
5432 - Database:
postgres - Username:
postgres - Password:
postgres
The hostname my-postgres-container resolves because Docker Compose places both services on the same internal network.
6. Stop and Clean Up
| Command | Effect |
|---|---|
docker compose stop |
Pauses containers (preserves data) |
docker compose down |
Removes containers (preserves volumes) |
docker compose down -v |
Removes containers and volumes (erases all data) |
make restart |
Recreates PostgreSQL container (reloads data.dump) |
How the Auto-Import Works
The data.dump file mounts to /docker-entrypoint-initdb.d/ inside the PostgreSQL container. PostgreSQL's official image executes any .sql, .sql.gz, or .dump files in this directory on first initialization. This pattern, defined in the docker-compose.yml, ensures every new container starts with identical sample data for the dimensional modeling labs.
Makefile Convenience Commands
The Makefile provides shortcuts for common operations:
make up # Start services
make stop # Stop services
make restart # Recreate PostgreSQL (useful after .env changes)
make logs # Stream container logs
make ip # Show PostgreSQL container IP address
make inspect # Display detailed container configuration
Troubleshooting Common Issues
Port conflicts: If port 5432 or 5050 is in use, modify POSTGRES_PORT or PGADMIN_PORT in .env before starting.
Permission denied on Windows: Ensure Docker Desktop is running in Linux container mode. The data.dump import requires Unix line endings—use Git's autocrlf setting or WSL2.
PGAdmin cannot connect: Verify the server host is my-postgres-container (not localhost). The containers communicate on Docker's internal network, not your host network.
Summary
- The intermediate bootcamp database environment with Docker requires no local PostgreSQL installation
- Copy
example.envto.envand runmake upordocker compose up -dto start - PostgreSQL 14 and PGAdmin 4 run in linked containers with persistent volumes
data.dumpauto-imports sample data on first container start via/docker-entrypoint-initdb.d/- Use
make restartto reset to clean state with fresh sample data
Frequently Asked Questions
What credentials should I use for PGAdmin?
Use the email and password defined in your .env file. The defaults from example.env are postgres@postgres.com for the email and postgres for the password. These are separate from the PostgreSQL database credentials.
Why can't I connect to PostgreSQL from PGAdmin using localhost?
The containers run on an isolated Docker network. From PGAdmin's perspective, PostgreSQL is at hostname my-postgres-container, not localhost. Enter my-postgres-container as the host when registering the server in PGAdmin.
How do I reset the database to its original state?
Run make restart or execute docker compose down && docker compose up -d. The restart target specifically recreates the PostgreSQL container, triggering the data.dump import fresh. To completely erase all data including volumes, use docker compose down -v.
Where is the actual data stored?
PostgreSQL data persists in a Docker named volume (postgres-data) mapped to /var/lib/postgresql/data in the container. PGAdmin settings persist in pgadmin-data. These survive docker compose stop and docker compose down unless you explicitly remove volumes with docker compose down -v.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →