Skip to content

Local Database With Scripts (PostgreSQL)

When developing apps locally it can be really useful to have a dockerised database unique to the application.

Often rather than just running a pre-built image, you'll want to run a database with some initial data, tables, or a schema.

For this purpose we can create our own image that extends the base image and adds our own scripts.

Setup

For most applications the directory structure will look something like this:

database/
  Dockerfile
  scripts/
    01-create-tables.sql
development/
  compose.yml
src/
  ...
tests/
  ...

Dockerfile

Create a dockerfile in the database/ directory:

dockerfile
FROM postgres:17

# Setup the postgres environment variables
ENV POSTGRES_USER=myuser
ENV POSTGRES_PASSWORD=mypassword
ENV POSTGRES_DB=mydatabase

# Setup port
EXPOSE 5432

# Copy all the scripts into the container
COPY ./scripts /docker-entrypoint-initdb.d/

DANGER

As this is a local development database, we're using the a simple username and password. Do not use this in production.

Scripts

Create any scripts you need in the database/scripts/ directory. PostgreSQL will run these scripts in alphabetical order against the database specified in the POSTGRES_DB environment variable.

sql
CREATE TABLE MyTable (
    Id INT NOT NULL PRIMARY KEY,
    Name VARCHAR(50) NOT NULL
);

Compose

Lastly we need to create a docker-compose.yml file in the development/ directory:

yaml
services:
  db:
    build:
      context: ../database
      dockerfile: Dockerfile
    volumes:
      - db-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  db-data: