yes

Seed Postgres database with Docker Compose

Postgres Docker Seed Data

Provisioning local infrastructure can be a bit cumbersome, at least during the initial setup. Docker to the rescue! If you haven't used Docker yet then get on it ASAP!

With a simple command, you can provision (and seed) different resources like databases, messaging queues and other services. In this article, I'm going to show you how to create a few simple scripts to get you going with Postgres AND seed some data.

When running docker-compose up in your favourite terminal, Docker will look for a docker-compose.yml file to get instructions. Here I have a simple docker-compose file to spin up a Redis and a Postgres server.

version: "3.8"
services:
  redis:
    image: redis
    ports:
      - "6379:6379"
  postgres:
    build:
      context: ./db
    environment:
      - POSTGRES_PASSWORD=mydbpwd
    ports:
      - "5432:5432"

We also map Redis and Postgres ports to the host machine and instead of pulling the Postgres image directly, we point the compose tool to a directory where the Dockerfile sits: ./db. The db folder has several files in it:

db
|- db.dump.sql
|- Dockerfile
|- init-db.sh

The db.dump.sql just contains plain SQL scripts for both DML (Data Definition Language) and DDL (Data Manipulation Language) instructions. Next up is the Dockerfile:

FROM postgres:11

ADD ./init-db.sh /docker-entrypoint-initdb.d/
ADD ./db.dump.sql /db-dumps/

Here we pull the official Postgres 11 image and copy the dump and bootstrap scripts into the container. docker-entrypoint-initdb.d is a magical directory where all the .sh and .sql scripts are ran upon the DB initialization. init-db.sh file creates a new database, user and assigns it all the rights. After the database and user have been set up, the seeding SQL script is ran.

#!/bin/bash

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE USER newuser;
    CREATE DATABASE newdb;
    GRANT ALL PRIVILEGES ON DATABASE newdb TO newuser;
EOSQL

psql -f /db-dumps/db.dump.sql newdb

The last bit is to run the docker-compose up command and observe how everything beautifully comes to life:

Postgres Docker Seed Data Terminak

After you're done with the project, you can easily dismantle the resources by running docker-compose down, easy as.