diff options
Diffstat (limited to 'build')
-rw-r--r-- | build/init/Dockerfile | 21 | ||||
-rwxr-xr-x | build/init/init | 108 | ||||
-rw-r--r-- | build/nginx/Dockerfile | 21 | ||||
-rw-r--r-- | build/php/Dockerfile | 17 | ||||
-rw-r--r-- | build/postgres/Dockerfile | 21 |
5 files changed, 188 insertions, 0 deletions
diff --git a/build/init/Dockerfile b/build/init/Dockerfile new file mode 100644 index 0000000..98eb285 --- /dev/null +++ b/build/init/Dockerfile @@ -0,0 +1,21 @@ +FROM alpine:3.19 + +# install packages +RUN apk add --no-cache postgresql16-client tini shadow +RUN rm -fr /var/cache/apk/* + +# setup main user +RUN adduser -D init +RUN groupmod --gid 1000 init +RUN usermod --uid 1000 init + +# copy scripts +COPY ./init /usr/local/bin/init + +# remove build packages +RUN apk del shadow + +# do the +USER init +ENTRYPOINT ["/sbin/tini", "--"] +CMD ["/usr/local/bin/init"] diff --git a/build/init/init b/build/init/init new file mode 100755 index 0000000..a889a8b --- /dev/null +++ b/build/init/init @@ -0,0 +1,108 @@ +#!/bin/sh + +errors=$(mktemp) + +step() { + printf '\x1b[34;1m>> %s\x1b[0m\n' "$*" +} + +error() { + { + printf '\x1b[31;1merror: \x1b[0m%s\n' "$*"; + grep -v 'current transaction is aborted' < "$errors"; + printf "\x1b[31m;1error: \x1b[0mAborting migrations, fix file(s) then restart process."; + } 1>&2; +} + +try() { + "$@" 2> "$errors"; + count=$(grep -c 'ERROR' < "$errors") + if [ "$count" -eq 0 ]; then + return 0; + else + return 1; + fi +} + +export PGPASSWORD="$POSTGRES_PASSWORD" + +psql() { + /usr/bin/psql \ + -h db \ + -p 5432 \ + -d "$POSTGRES_DB" \ + -U "$POSTGRES_USER" \ + "$@" +} + +pg_isready() { + /usr/bin/pg_isready \ + -h db \ + -p 5432 \ + -d "$POSTGRES_DB" \ + -U "$POSTGRES_USER" +} + +curr_revision() { + psql -qtAX -f /db/rev.sql; +} + +wait_until_ready() { + step 'Checking if the database is ready...'; + while true; do + pg_isready; + code=$?; + if [ $code -eq 0 ]; then + break; + fi + sleep 3; + done +} + +run_migrations() { + i="$1" + while true; do + name=$(printf "%04d" "$i"); + file="/db/migrations/$name.sql" + if [ -f "$file" ]; then + if try psql -f "$file"; then + i=$((i+1)); + continue; + else + error "An error occoured during a migration (rev $name)" + return 1; + fi + else + return 0; + fi + done +} + +init () { + # reomve ready status + # so php ignores requests + rm -f /status/ready + + step 'Waiting for database'; + # make sure the database is running + # before we run any requests + wait_until_ready; + step 'Database ready'; + + step 'Peforming migrations'; + # get the current revision + REV=$(curr_revision); + step "Database at revision: $REV" + # run each migration that is + # higher than our current revision + if ! run_migrations "$REV"; then + return 1; + fi + + step 'Database is initialized' + # database is ready + touch /status/ready +} + +init +rm "$errors" diff --git a/build/nginx/Dockerfile b/build/nginx/Dockerfile new file mode 100644 index 0000000..6aa4e00 --- /dev/null +++ b/build/nginx/Dockerfile @@ -0,0 +1,21 @@ +FROM alpine:3.19 + +# install packages +RUN apk add --no-cache nginx shadow tini +RUN rm -fr /var/cache/apk/* + +# update nginx user +RUN groupmod --gid 1000 nginx +RUN usermod --uid 1000 nginx + +# remove build packages +RUN apk del shadow + +# make log syms +RUN ln -sf /dev/stdout /var/log/nginx/access.log && \ + ln -sf /dev/stderr /var/log/nginx/error.log + +# do the +USER nginx +ENTRYPOINT ["/sbin/tini", "--"] +CMD ["/usr/sbin/nginx", "-c", "/etc/nginx/nginx.conf"] diff --git a/build/php/Dockerfile b/build/php/Dockerfile new file mode 100644 index 0000000..5f4bdd5 --- /dev/null +++ b/build/php/Dockerfile @@ -0,0 +1,17 @@ +FROM php:fpm-alpine + +# install packages +RUN apk add --no-cache postgresql-dev runuser shadow +RUN rm -fr /var/cache/apk/* + +# update php user +RUN groupmod --gid 1000 www-data +RUN usermod --uid 1000 www-data + +# install php packages +RUN docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql +RUN docker-php-ext-install pdo pdo_pgsql + +# remove build packages +RUN apk del shadow +USER www-data diff --git a/build/postgres/Dockerfile b/build/postgres/Dockerfile new file mode 100644 index 0000000..32bca6e --- /dev/null +++ b/build/postgres/Dockerfile @@ -0,0 +1,21 @@ +FROM postgres:16-alpine + +# install packages +RUN apk add --no-cache make git shadow +RUN rm -fr /var/cache/apk/* + +# install pgjwt +RUN git clone https://github.com/michelp/pgjwt.git /tmp/pgjwt +WORKDIR /tmp/pgjwt +RUN make install + +# update postgres user +RUN groupmod --gid 1000 postgres +RUN usermod --uid 1000 postgres + +# remove build packages +RUN apk del make git shadow + +# fix workdir +WORKDIR / +USER postgres |