This commit is contained in:
@@ -1,8 +1,9 @@
|
|||||||
FROM postgres:15
|
FROM pgvector/pgvector:pg15
|
||||||
|
|
||||||
# Install additional tools
|
# Install additional tools
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN apt-get update && apt-get install -y \
|
||||||
postgresql-client \
|
postgresql-client \
|
||||||
|
cron \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# Create directory for scripts
|
# Create directory for scripts
|
||||||
@@ -12,9 +13,31 @@ RUN mkdir -p /docker-entrypoint-initdb.d
|
|||||||
COPY init.sh /docker-entrypoint-initdb.d/
|
COPY init.sh /docker-entrypoint-initdb.d/
|
||||||
RUN chmod +x /docker-entrypoint-initdb.d/init.sh
|
RUN chmod +x /docker-entrypoint-initdb.d/init.sh
|
||||||
|
|
||||||
|
# Copy refresh script
|
||||||
|
COPY refresh.sh /usr/local/bin/
|
||||||
|
RUN chmod +x /usr/local/bin/refresh.sh
|
||||||
|
|
||||||
# Environment variables
|
# Environment variables
|
||||||
ENV SOURCE_DB_URL=""
|
ENV SOURCE_DB_URL=""
|
||||||
ENV TARGET_DB_NAME="shadow_db"
|
ENV TARGET_DB_NAME="shadow_db"
|
||||||
|
ENV TARGET_DB_USER="postgres"
|
||||||
|
ENV TARGET_DB_PASSWORD=""
|
||||||
|
ENV REFRESH_TIME="00:00"
|
||||||
|
|
||||||
|
# Define volume for persistent data
|
||||||
|
VOLUME ["/var/lib/postgresql/data"]
|
||||||
|
|
||||||
# Expose PostgreSQL port
|
# Expose PostgreSQL port
|
||||||
EXPOSE 5432
|
EXPOSE 5432
|
||||||
|
|
||||||
|
# Add crontab file
|
||||||
|
RUN echo "0 0 * * * /usr/local/bin/refresh.sh >> /var/log/cron.log 2>&1" > /etc/cron.d/refresh-cron
|
||||||
|
RUN chmod 0644 /etc/cron.d/refresh-cron
|
||||||
|
|
||||||
|
# Create the log file to be able to run tail
|
||||||
|
RUN touch /var/log/cron.log
|
||||||
|
|
||||||
|
# Start cron and PostgreSQL
|
||||||
|
COPY docker-entrypoint.sh /
|
||||||
|
RUN chmod +x /docker-entrypoint.sh
|
||||||
|
ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Start cron
|
||||||
|
service cron start
|
||||||
|
|
||||||
|
# Update crontab with the specified refresh time
|
||||||
|
hour=$(echo $REFRESH_TIME | cut -d':' -f1)
|
||||||
|
minute=$(echo $REFRESH_TIME | cut -d':' -f2)
|
||||||
|
echo "$minute $hour * * * /usr/local/bin/refresh.sh >> /var/log/cron.log 2>&1" > /etc/cron.d/refresh-cron
|
||||||
|
chmod 0644 /etc/cron.d/refresh-cron
|
||||||
|
|
||||||
|
# Start PostgreSQL
|
||||||
|
exec docker-entrypoint.sh postgres
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Wait for PostgreSQL to be ready
|
|
||||||
until pg_isready; do
|
|
||||||
echo "Waiting for PostgreSQL to be ready..."
|
|
||||||
sleep 2
|
|
||||||
done
|
|
||||||
|
|
||||||
# Create the target database
|
|
||||||
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
|
|
||||||
CREATE DATABASE $TARGET_DB_NAME;
|
|
||||||
EOSQL
|
|
||||||
|
|
||||||
# Copy the database if SOURCE_DB_URL is provided
|
|
||||||
if [ ! -z "$SOURCE_DB_URL" ]; then
|
|
||||||
echo "Copying database from $SOURCE_DB_URL to $TARGET_DB_NAME..."
|
|
||||||
|
|
||||||
# Dump the source database
|
|
||||||
pg_dump "$SOURCE_DB_URL" | psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$TARGET_DB_NAME"
|
|
||||||
|
|
||||||
echo "Database copy completed successfully"
|
|
||||||
else
|
|
||||||
echo "No SOURCE_DB_URL provided, skipping database copy"
|
|
||||||
fi
|
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Starting database refresh at $(date)"
|
||||||
|
|
||||||
|
# Wait for PostgreSQL to be ready
|
||||||
|
until pg_isready; do
|
||||||
|
echo "Waiting for PostgreSQL to be ready..."
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
# Create user if it doesn't exist
|
||||||
|
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
|
||||||
|
DO
|
||||||
|
\$do\$
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '$POSTGRES_USER') THEN
|
||||||
|
CREATE USER $POSTGRES_USER WITH PASSWORD '$POSTGRES_PASSWORD' SUPERUSER;
|
||||||
|
END IF;
|
||||||
|
END
|
||||||
|
\$do\$;
|
||||||
|
EOSQL
|
||||||
|
|
||||||
|
# Drop and recreate the target database
|
||||||
|
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
|
||||||
|
DROP DATABASE IF EXISTS $TARGET_DB_NAME;
|
||||||
|
CREATE DATABASE $TARGET_DB_NAME OWNER $POSTGRES_USER;
|
||||||
|
EOSQL
|
||||||
|
|
||||||
|
# Copy the database if SOURCE_DB_URL is provided
|
||||||
|
if [ ! -z "$SOURCE_DB_URL" ]; then
|
||||||
|
echo "Copying database from $SOURCE_DB_URL to $TARGET_DB_NAME..."
|
||||||
|
|
||||||
|
# Dump the source database and filter out transaction_timeout
|
||||||
|
pg_dump "$SOURCE_DB_URL" | grep -v "transaction_timeout" | psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$TARGET_DB_NAME"
|
||||||
|
|
||||||
|
# Update ownership of all objects
|
||||||
|
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$TARGET_DB_NAME" <<-EOSQL
|
||||||
|
DO \$\$
|
||||||
|
DECLARE
|
||||||
|
r record;
|
||||||
|
BEGIN
|
||||||
|
FOR r IN SELECT tablename FROM pg_tables WHERE schemaname = 'public'
|
||||||
|
LOOP
|
||||||
|
EXECUTE 'ALTER TABLE public.' || quote_ident(r.tablename) || ' OWNER TO $POSTGRES_USER';
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
FOR r IN SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = 'public'
|
||||||
|
LOOP
|
||||||
|
EXECUTE 'ALTER SEQUENCE public.' || quote_ident(r.sequence_name) || ' OWNER TO $POSTGRES_USER';
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
FOR r IN SELECT typname FROM pg_type WHERE typnamespace = 'public'::regnamespace
|
||||||
|
LOOP
|
||||||
|
EXECUTE 'ALTER TYPE public.' || quote_ident(r.typname) || ' OWNER TO $POSTGRES_USER';
|
||||||
|
END LOOP;
|
||||||
|
END
|
||||||
|
\$\$;
|
||||||
|
EOSQL
|
||||||
|
|
||||||
|
echo "Database refresh completed successfully at $(date)"
|
||||||
|
else
|
||||||
|
echo "No SOURCE_DB_URL provided, skipping database refresh"
|
||||||
|
fi
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
latest
|
||||||
Reference in New Issue
Block a user