Step-by-Step: Setting Up a Postgres Database with Docker and Seeding Test Data

Step-by-Step: Setting Up a Postgres Database with Docker and Seeding Test Data

In this blog post, we'll explore the process of setting up and configuring a Postgres database using Docker and seeding it with test data.

This approach can be used for a variety of apps and can be easily adapted for your own needs. We'll cover all the necessary steps, from the Docker configuration to creating and seeding the database.

By the end of this post, you'll have a Postgres database up and running, and be able to seed it with test data, allowing you to test your setup quickly and efficiently.

TL;DR

You can grab the source for this project from the Github Repository. Copy the docker-compose.yml file and postgres folder to your project. Then run docker-compose up --build -d. Viola, you have a fully seeded Postgres database running

Docker Setup

We have a docker-compose.yml that setups up the database environment:

version: '3.8'
services:
  db:
    restart: always
    build:
      context: .
      dockerfile: postgres/Dockerfile
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - '5432:5432'
    networks:
      - postgres-network

networks:
  postgres-network:
    driver: bridge

Notice the build step includes the postgres/Dockerfile which is used to build the Postgres database, create the test schema and seed the database:

FROM postgres:alpine

ADD /postgres/migrations/1_schema.sql /docker-entrypoint-initdb.d
ADD /postgres/migrations/2_data.sql /docker-entrypoint-initdb.d

RUN chmod a+r /docker-entrypoint-initdb.d/*

Database Schema

This is the database schema I use for my example apps, you can change the file /postgres/migrations/1_schema.sql to any schema you like.

CREATE TABLE top3
(
    id        SERIAL NOT NULL,
    created_at DATE   NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT top3_pkey PRIMARY KEY (id)
);

CREATE TABLE todo
(
    id       SERIAL  NOT NULL,
    title    TEXT    NOT NULL,
    complete BOOLEAN NOT NULL DEFAULT false,
    top3_id   INTEGER NOT NULL,

    CONSTRAINT todo_pkey PRIMARY KEY (id)
);

ALTER TABLE todo
    ADD CONSTRAINT todo_top3_id_fkey
        FOREIGN KEY (top3_id) REFERENCES top3 (id)
            ON DELETE CASCADE ON UPDATE CASCADE;

This will create the Schema:

Seeding the Database

I then seed the data with test data, again this file /postgres/migrations/2_data.sql can be changed to any seed data you like:

INSERT INTO public.top3 (created_at) VALUES(CURRENT_TIMESTAMP);

INSERT INTO public.todo (id, title, complete, top3_id) VALUES(1, 'Research tech', false, 1);
INSERT INTO public.todo (id, title, complete, top3_id) VALUES(2, 'Write article', false, 1);
INSERT INTO public.todo (id, title, complete, top3_id) VALUES(3, 'Publish article', false, 1);

Commands

Now that everything is in place you can start the database with:

docker-compose up --build -d

Configuration

  • Host = localhost

  • Port = 5432

  • Database Name = postgres

  • User = postgres

  • Password = postgres

Conclusion

In conclusion, setting up and configuring a Postgres database with Docker is a great way to get your project up and running quickly and easily. With the steps outlined in this post, you can quickly and efficiently set up a Postgres database with Docker, as well as seed it with test data. This approach can save you time and effort in the long run and can be easily adapted to your own needs.

I hope this post has been useful, you can grab the source from the Github Repository.