diff --git a/with-db.sh b/with-db.sh new file mode 100755 index 0000000..6ee6fb4 --- /dev/null +++ b/with-db.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +# * Run a postgres server at localhost:${DB_PORT} +# * Wait for it to be up and running +# * Run the passed arguments as a command +# * Kill the postgres server +# +# Example usage: ./with-db.sh cabal test +# +# The application running in this context can use +# the DB_* variables to connect to postgres. +export DB_USER=opium +export DB_PASS=opium +export DB_NAME=opium +export DB_PORT=5442 + +# On error or exit: Kill the postgres container +function kill_db_container { + docker kill "${CONTAINER_ID}" > /dev/null +} +trap kill_db_container EXIT + +CONTAINER_ID=$(docker run --rm \ + -e "POSTGRES_USER=${DB_USER}" \ + -e "POSTGRES_PASSWORD=${DB_PASS}" \ + -e "POSTGRES_DB=${DB_NAME}" \ + -p "127.0.0.1:${DB_PORT}:5432" \ + --health-cmd pg_isready \ + --health-interval 0.25s \ + --detach \ + postgres:14-alpine) + +# Setting --health-cmd above allows us to wait for postgres to be up +until [[ "$(docker inspect -f "{{.State.Health.Status}}" "${CONTAINER_ID}" || true)" = healthy ]] +do + sleep 0.1 +done + +"$@"