diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..6f1bb82 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,109 @@ +#!/bin/sh +# +### entrypoint script for mariadb container +# + +# instantiate variables +sqlCmd='/tmp/cmd.sql' + +# generate root password if not specified +if [ -z "$MYSQL_ROOT_PASSWORD" ]; then + MYSQL_ROOT_PASSWORD="$( head /dev/urandom | tr -dc A-Za-z0-9 | head -c32 )" + export MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD +fi + +# change mysql UID & GID +sed -i "s/mysql:x:100:101/mysql:x:${MYSQL_UID}:${MYSQL_GID}/" /etc/passwd +sed -i "s/mysql:x:101/mysql:x:${MYSQL_GID}/" /etc/group +chown -R mysql:mysql /var/lib/mysql + +# execute pre-init scripts: /docker-entrypoint-preinit.d/*.sh +for f in /docker-entrypoint-preinit.d/*.sh; do + if [ -s "$f" ]; then + printf "PRE-INIT: Executing %s\n" "$f" + /bin/sh "$f" + fi +done + +# create socket file +mkdir -p /run/mysqld > /dev/null 2>&1 +touch /run/mysqld/mysqld.dock +chown -R mysql:mysql /run/mysqld + +# create database if one does not already exist +if [ -z "$(ls -A /var/lib/mysql/ 2> /dev/null)" ]; then + # create SQL cmd file + touch "$sqlCmd" + + # create system tables + printf "DB-CREATE: Setting up mySQL system tables\n" + mysql_install_db --user=mysql --ldata=/var/lib/mysql > /dev/null + + # statement to create new SQL database + printf "DB-CREATE: Generating SQL database create statement for '%s'\n" "$MYSQL_DATABASE" + echo "CREATE DATABASE IF NOT EXISTS \'$MYSQL_DATABASE\' CHARACTER SET $MYSQL_CHARSET COLLATE $MYSQL_COLLATION;" >> "$sqlCmd" + + # statements to: + # cleanup permissions: + # leave root@localhost as root-account integrated, + # add root@% with password authentication + # create SQL user if requested + # remove 'test' table + echo 'USE mysql;' >> "$sqlCmd" + echo 'FLUSH PRIVILEGES;' >> "$sqlCmd" + printf "DB-CREATE: Generating SQL permissions statement for 'root@%%'\n" + echo "GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD' WITH GRANT OPTION;" >> "$sqlCmd" + if [ -n "$MYSQL_USER" ] && [ -n "$MYSQL_PASSWORD" ]; then + printf "DB-CREATE: Generating SQL permissions statement for '%s'\n" "$MYSQL_USER" + echo "GRANT ALL ON \'$MYSQL_DATABASE\'.* TO \'$MYSQL_USER\'@'%' IDENTIFIED BY \'$MYSQL_PASSWORD\';" >> "$sqlCmd" + fi + printf "DB-CREATE: Cleaning up 'test' table\n" + echo 'DROP DATABASE IF EXISTS test;' >> "$sqlCmd" + echo 'FLUSH PRIVILEGES;' >> "$sqlCmd" + + # execute statements against mariadb and cleanup + printf "DB-CREATE: Bootstrapping mySQL database\n" + mysqld --user=mysql --bootstrap --verbose=0 --skip-name-resolve --skip-networking=0 < "$sqlCmd" + rm -f "$sqlCmd" +else + # files exist, ignore the request to create a database + printf "DB-CREATE: NOT creating %s\n" "$MYSQL_DATABASE" + printf "DB-CREATE: Using existing database\n" +fi + +# process supplied SQL files in /docker-entrypoint-initdb.d/*.(sql|sql.gz) +for f in /docker-entrypoint-initdb.d/*.sh; do + case "$f" in + *.sql) + if [ -s "$f" ]; then + printf "IMPORT-SQL: Importing %s\n" "$f" + mysqld --user=mysql --bootstrap --verbose=0 --skip-name-resolve --skip-networking=0 < "$f" + printf "\n" + fi + ;; + *.sql.gz) + if [ -s "$f" ]; then + printf "IMPORT-SQL: Importing %s\n" "$f" + gunzip -c "$f" | mysqld --user=mysql --bootstrap --verbose=0 --skip-name-resolve --skip-networking=0 < "$f" + printf "\n" + fi + ;; + *) + printf "IMPORT-SQL: Cannot import %s\n" "$f" + ;; + esac +done + +# execute post-init scripts: /docker-entrypoint-postinit.d/*.sh +for f in /docker-entrypoint-postinit.d/*.sh; do + if [ -s "$f" ]; then + printf "POST-INIT: Executing %s\n" "$f" + /bin/sh "$f" + fi +done + +# execute commands passed to this container +printf "\nInitialization complete... Container ready...\n" +exec "$@" + +#EOF \ No newline at end of file