commit 61d20d8f14d1865d8c3f614d442a08d1890000df Author: Benjamin Böhmke Date: Sat Sep 16 16:51:12 2017 +0200 init diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f06f40d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM alpine:3.6 +MAINTAINER Benjamin Böhmke + +RUN apk add --no-cache mysql-client postgresql-client postgresql-bdr + +ADD entrypoint.sh /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] +CMD ["app:init"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..88bdf1c --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +Database Helper +=============== + +Docker database initialization for MySQL and PostgreSQL. + + +Usage +----- + +Direct usage: +``` +docker run --rm \ + -e DB_TYPE=postgresql \ + -e DB_ROOT_PASSWORD=password \ + -e DB_HOST=host_name \ + -e DB_DATABASE=database_to_create \ + -e DB_USER=user_to_create \ + -e DB_PASSWORD=user_password \ + bboehmke/db-helper +``` + +In compose file: +``` +services: + db_init: + restart: "no" + image: bboehmke/db-helper + environment: + - DB_TYPE=postgresql + - DB_ROOT_PASSWORD=password + - DB_HOST=host_name + - DB_DATABASE=database_to_create + - DB_USER=user_to_create + - DB_PASSWORD=user_password +``` + + +Available Configuration Parameters +---------------------------------- + +- **DB_TYPE**: Which type of database should be used: mysql or postgresql +- **DB_HOST**: Host name of database server +- **DB_ROOT_PASSWORD**: Password of root account +- **DB_ROOT_USER**: Name of root account (Default: Database default) +- **DB_PORT**: Port of database server (Default: Database default) +- **DB_DATABASE**: Database to create +- **DB_USER**: User to create with access to `DB_DATABASE` +- **DB_PASSWORD**: Password of `DB_USER` diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..ac2941f --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,118 @@ +#!/bin/sh +set -e + + +case ${DB_TYPE} in + postgresql) + DB_ROOT_USER=${DB_ROOT_USER:-postgres} + DB_PORT=${DB_PORT:-5432} + export PGPASSWORD=$DB_ROOT_PASSWORD + ;; + + mysql) + DB_ROOT_USER=${DB_ROOT_USER:-root} + DB_PORT=${DB_PORT:-3306} + ;; +esac + + +check_database_connection() { + if [[ -z ${DB_HOST} ]] || [[ -z ${DB_ROOT_PASSWORD} ]] || [[ -z ${DB_DATABASE} ]] || [[ -z ${DB_USER} ]] || [[ -z ${DB_PASSWORD} ]]; then + echo + echo "ERROR: " + echo " Please specify DB_HOST, DB_ROOT_PASSWORD, DB_DATABASE, DB_USER & DB_PASSWORD" + echo " Aborting..." + echo + return 1 + fi + + case ${DB_TYPE} in + mysql) + prog="mysqladmin -h ${DB_HOST} -P ${DB_PORT} -u ${DB_ROOT_USER} -p${DB_ROOT_PASSWORD} status" + ;; + postgresql) + prog="pg_isready -h ${DB_HOST} -p ${DB_PORT} -U ${DB_ROOT_USER} -t 1" + ;; + *) + echo + echo "ERROR: " + echo " Please specify the database type in use via the DB_TYPE configuration option." + echo " Accepted values are \"postgresql\" or \"mysql\". Aborting..." + echo + return 1 + esac + timeout=60 + while ! ${prog} >/dev/null 2>&1 + do + timeout=$(expr $timeout - 1) + if [[ $timeout -eq 0 ]]; then + echo + echo "Could not connect to database server. Aborting..." + return 1 + fi + echo -n "." + sleep 1 + done + echo +} + + +postgresql_init() { + result=`psql -h$DB_HOST -p $DB_PORT -U$DB_ROOT_USER -tc "SELECT datname FROM pg_catalog.pg_database WHERE datname like '$DB_DATABASE';"` + if [ ! $result ]; then + psql -h$DB_HOST -p $DB_PORT -U$DB_ROOT_USER -tc "create database $DB_DATABASE;" > /dev/null + echo "Database \"$DB_DATABASE\" created" + else + echo "Database \"$DB_DATABASE\" already exist" + fi + + result=`psql -h$DB_HOST -p $DB_PORT -U$DB_ROOT_USER -tc "SELECT usename FROM pg_catalog.pg_user WHERE usename = '$DB_USER';"` + if [ ! $result ]; then + psql -h$DB_HOST -p $DB_PORT -U$DB_ROOT_USER -c "CREATE ROLE $DB_USER with LOGIN CREATEDB PASSWORD '$DB_PASSWORD';" > /dev/null + echo "User \"$DB_USER\" created" + else + echo "User \"$DB_USER\" already exist" + fi + + psql -h$DB_HOST -p $DB_PORT -U$DB_ROOT_USER -tc "GRANT ALL PRIVILEGES ON DATABASE $DB_DATABASE to $DB_USER;" > /dev/null +} + +mysql_init() { + result=`mysql -P $DB_PORT -u$DB_ROOT_USER -p$DB_ROOT_PASSWORD -h$DB_HOST -Bse "show databases like '$DB_DATABASE';"` + if [ ! $result ]; then + mysql -P $DB_PORT -u$DB_ROOT_USER -p$DB_ROOT_PASSWORD -h$DB_HOST -Bse "create database $DB_DATABASE;" + echo "Database \"$DB_DATABASE\" created" + else + echo "Database \"$DB_DATABASE\" already exist" + fi + + result=`mysql -P $DB_PORT -u$DB_ROOT_USER -p$DB_ROOT_PASSWORD -h$DB_HOST -Bse "SELECT User FROM mysql.user WHERE User = '$DB_USER' AND Host = '%';"` + if [ ! $result ]; then + mysql -P $DB_PORT -u$DB_ROOT_USER -p$DB_ROOT_PASSWORD -h$DB_HOST -Bse "CREATE USER '$DB_USER'@'%' IDENTIFIED BY '$DB_PASSWORD';" + echo "User \"$DB_USER\" created" + else + echo "User \"$DB_USER\" already exist" + fi + + mysql -P $DB_PORT -u$DB_ROOT_USER -p$DB_ROOT_PASSWORD -h$DB_HOST -Bse "GRANT ALL PRIVILEGES ON \`$DB_DATABASE\`.* TO '$DB_USER'@'%';" +} + + +case ${1} in + app:init) + check_database_connection + + case ${DB_TYPE} in + postgresql) + postgresql_init + ;; + + mysql) + mysql_init + ;; + esac + ;; + *) + exec "$@" + ;; +esac