feat(tools): add docker scripts

This commit is contained in:
2026-02-22 20:50:26 +01:00
parent 5957ac4789
commit d343524e05
7 changed files with 249 additions and 8 deletions
+21
View File
@@ -0,0 +1,21 @@
#!/bin/bash
# clean_docker.sh - Remove a PostgreSQL Docker container
# Usage: ./clean_docker.sh [container_name]
set -e # Exit immediately if a command exits with a non-zero status
CONTAINER="${1:-postgres}"
if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Container $CONTAINER does not exist"
exit 0
fi
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Stopping container $CONTAINER"
docker stop "$CONTAINER"
fi
echo "Removing container $CONTAINER"
docker rm "$CONTAINER"
+52
View File
@@ -0,0 +1,52 @@
#!/bin/bash
# install_docker.sh - Install the PostgreSQL extension to a Docker container
# Usage: ./install_docker.sh [container_name] [project_name] [version]
set -e # Exit immediately if a command exits with a non-zero status
CONTAINER="${1:-postgres}"
PROJECT_FILENAME="${2:-pg_morbac}"
PROJECT_VERSION="${3}"
if [ -z "$PROJECT_VERSION" ]; then
SCRIPT_DIR=$(dirname "$0")
CONTROL_FILE="${PROJECT_FILENAME}.control"
PROJECT_VERSION=$("$SCRIPT_DIR/get_version.sh" "$CONTROL_FILE")
fi
if [ -z "$PROJECT_VERSION" ]; then
echo "Error: could not detect version" >&2
exit 1
fi
SQL_FILE="${PROJECT_FILENAME}--${PROJECT_VERSION}.sql"
CONTROL_FILE="${PROJECT_FILENAME}.control"
if [ ! -f "$SQL_FILE" ]; then
echo "Error: versioned SQL file not found: $SQL_FILE" >&2
exit 1
fi
if [ ! -f "$CONTROL_FILE" ]; then
echo "Error: control file not found: $CONTROL_FILE" >&2
exit 1
fi
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Error: Docker container not running: $CONTAINER" >&2
exit 1
fi
docker exec "$CONTAINER" mkdir -p /tmp/pg_morbac
docker cp "$CONTROL_FILE" "$CONTAINER:/tmp/pg_morbac/"
docker cp "$SQL_FILE" "$CONTAINER:/tmp/pg_morbac/"
docker exec "$CONTAINER" sh -c "
EXTDIR=\$(pg_config --sharedir)/extension
cp /tmp/pg_morbac/${CONTROL_FILE} \$EXTDIR/
cp /tmp/pg_morbac/${SQL_FILE} \$EXTDIR/
rm -rf /tmp/pg_morbac
"
echo "Installed ${PROJECT_FILENAME} v${PROJECT_VERSION} to container ${CONTAINER}"
+43
View File
@@ -0,0 +1,43 @@
#!/bin/bash
# start_docker.sh - Start a PostgreSQL Docker container
# Usage: ./start_docker.sh [container_name] [port]
set -e # Exit immediately if a command exits with a non-zero status
CONTAINER="${1:-postgres}"
PORT="${2:-5432}"
POSTGRES_PASSWORD="${POSTGRES_PASSWORD:-postgres}"
POSTGRES_USER="${POSTGRES_USER:-postgres}"
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Container $CONTAINER is already running"
exit 0
else
echo "Starting existing container $CONTAINER"
docker start "$CONTAINER"
sleep 2
fi
else
echo "Creating and starting container $CONTAINER"
docker run -d \
--name "$CONTAINER" \
-e POSTGRES_PASSWORD="$POSTGRES_PASSWORD" \
-e POSTGRES_USER="$POSTGRES_USER" \
-p "${PORT}:5432" \
postgres:latest
sleep 3
fi
echo "Waiting for PostgreSQL to be ready..."
for i in {1..30}; do
if docker exec "$CONTAINER" psql -U "$POSTGRES_USER" -c '\q' 2>/dev/null; then
echo "PostgreSQL is ready in container $CONTAINER"
exit 0
fi
sleep 1
done
echo "Error: PostgreSQL did not become ready in time" >&2
exit 1
+16
View File
@@ -0,0 +1,16 @@
#!/bin/bash
# stop_docker.sh - Stop a PostgreSQL Docker container
# Usage: ./stop_docker.sh [container_name]
set -e # Exit immediately if a command exits with a non-zero status
CONTAINER="${1:-postgres}"
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Container $CONTAINER is not running"
exit 0
fi
echo "Stopping container $CONTAINER"
docker stop "$CONTAINER"
+41
View File
@@ -0,0 +1,41 @@
#!/bin/bash
# test_docker.sh - Run tests in a Docker container
# Usage: ./test_docker.sh [container_name] [database_name] [sql_file]
set -e # Exit immediately if a command exits with a non-zero status
CONTAINER="${1:-postgres}"
DB="${2:-morbac_test}"
SQL_FILE="${3:-pg_morbac.sql}"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
if [ ! -f "$PROJECT_DIR/$SQL_FILE" ]; then
echo "Error: SQL file not found: $SQL_FILE" >&2
exit 1
fi
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Error: Docker container not running: $CONTAINER" >&2
exit 1
fi
if ! docker exec "$CONTAINER" psql -U postgres -c '\q' 2>/dev/null; then
echo "Error: PostgreSQL not accessible in container: $CONTAINER" >&2
exit 1
fi
docker exec "$CONTAINER" psql -U postgres -c "DROP DATABASE IF EXISTS $DB" -q
docker exec "$CONTAINER" psql -U postgres -c "CREATE DATABASE $DB" -q
docker exec "$CONTAINER" mkdir -p /tmp/pg_morbac_test/tools
docker cp "$PROJECT_DIR/$SQL_FILE" "$CONTAINER:/tmp/pg_morbac_test/"
docker cp "$PROJECT_DIR/tests" "$CONTAINER:/tmp/pg_morbac_test/"
docker cp "$SCRIPT_DIR/test.sh" "$CONTAINER:/tmp/pg_morbac_test/tools/"
docker exec -w /tmp/pg_morbac_test "$CONTAINER" bash tools/test.sh "$DB" "$SQL_FILE"
docker exec "$CONTAINER" psql -U postgres -c "DROP DATABASE $DB" -q
docker exec "$CONTAINER" rm -rf /tmp/pg_morbac_test
+22
View File
@@ -0,0 +1,22 @@
#!/bin/bash
# uninstall_docker.sh - Uninstall the PostgreSQL extension from a Docker container
# Usage: ./uninstall_docker.sh [container_name] [project_name]
set -e # Exit immediately if a command exits with a non-zero status
CONTAINER="${1:-postgres}"
PROJECT_FILENAME="${2:-pg_morbac}"
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER}$"; then
echo "Error: Docker container not running: $CONTAINER" >&2
exit 1
fi
docker exec "$CONTAINER" sh -c "
EXTDIR=\$(pg_config --sharedir)/extension
rm -f \$EXTDIR/${PROJECT_FILENAME}.control
rm -f \$EXTDIR/${PROJECT_FILENAME}--*.sql
"
echo "Uninstalled ${PROJECT_FILENAME} from container ${CONTAINER}"