From 0491e2be05c4c41fd1fe71ddebead1c1884d8ce7 Mon Sep 17 00:00:00 2001 From: Victor Hahn Date: Fri, 10 Jul 2015 15:34:13 +0200 Subject: [PATCH 1/4] Allow creation of multiple databases for MySQL 5.7 --- 5.7/docker-entrypoint.sh | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/5.7/docker-entrypoint.sh b/5.7/docker-entrypoint.sh index 69d451940..bb4b2067b 100755 --- a/5.7/docker-entrypoint.sh +++ b/5.7/docker-entrypoint.sh @@ -66,9 +66,26 @@ if [ "$1" = 'mysqld' ]; then DROP DATABASE IF EXISTS test ; EOSQL - if [ "$MYSQL_DATABASE" ]; then - echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" >> "$tempSqlFile" - fi + + # Create database if specified on command line + if [ "$MYSQL_DATABASE" ]; then + echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" >> "$tempSqlFile" + fi + + # Create even more databases if specified on command line + i=1 + while : + do + this_varname=MYSQL_DATABASE$i + thisdb=${!this_varname} + if [ "$thisdb" ]; then + echo "CREATE DATABASE IF NOT EXISTS \`$thisdb\` ;" >> "$tempSqlFile" + ((i++)) + else + break + fi + done + if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" >> "$tempSqlFile" From 42110b84fad117fa4093eb7f93b5e532080eb621 Mon Sep 17 00:00:00 2001 From: Victor Hahn Date: Fri, 10 Jul 2015 16:42:53 +0200 Subject: [PATCH 2/4] Add multiple user management for MySQL 5.7 --- 5.7/docker-entrypoint.sh | 84 ++++++++++++++++++++++++++++++++-------- 1 file changed, 67 insertions(+), 17 deletions(-) diff --git a/5.7/docker-entrypoint.sh b/5.7/docker-entrypoint.sh index bb4b2067b..12b263f6c 100755 --- a/5.7/docker-entrypoint.sh +++ b/5.7/docker-entrypoint.sh @@ -65,35 +65,85 @@ if [ "$1" = 'mysqld' ]; then GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ; DROP DATABASE IF EXISTS test ; EOSQL - - - # Create database if specified on command line - if [ "$MYSQL_DATABASE" ]; then - echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" >> "$tempSqlFile" - fi - - # Create even more databases if specified on command line - i=1 + + + # Create databases if specified on command line + i=0 while : do - this_varname=MYSQL_DATABASE$i + if [ "$i" -eq "0" ]; then # support "legacy" option before multiple database support + this_varname=MYSQL_DATABASE + else + this_varname=MYSQL_DATABASE$i + fi thisdb=${!this_varname} - if [ "$thisdb" ]; then + + if [ "$thisdb" ]; then echo "CREATE DATABASE IF NOT EXISTS \`$thisdb\` ;" >> "$tempSqlFile" - ((i++)) + fi + + # Yet another DB? + if [ "$thisdb" ] || [ "$i" -eq "0" ]; then + let ++i else break fi done + # Create users and grant them rights on the appropriate databases + # If no number is used this user is granted rights on *all* DBs. + if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then + echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" >> "$tempSqlFile" + + i=0 + while : + do + if [ "$i" -eq "0" ]; then # support "legacy" option before multiple database support + this_varname=MYSQL_DATABASE + else + this_varname=MYSQL_DATABASE$i + fi + + thisdb=${!this_varname} + if [ "$thisdb" ]; then + echo "GRANT ALL ON \`"$thisdb"\`.* TO '"$MYSQL_USER"'@'%' ;" >> "$tempSqlFile" + fi + + # Yet another DB? + if [ "$thisdb" ] || [ "$i" -eq "0" ]; then + let ++i + else + break + fi + done + fi + + # If numbers are used on user specification they get rights on the database with the same number + i=1 + while : + do + db_varname=MYSQL_DATABASE$i + user_varname=MYSQL_USER$i + pass_varname=MYSQL_PASSWORD$i - if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then - echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" >> "$tempSqlFile" + db=${!db_varname} + user=${!user_varname} + pass=${!pass_varname} + + if [ "$user" -a "$pass" ]; then + echo "CREATE USER '"$user"'@'%' IDENTIFIED BY '"$pass"' ;" >> "$tempSqlFile" + if [ "$db" ]; then + echo "GRANT ALL ON \`"$db"\`.* TO '"$user"'@'%' ;" >> "$tempSqlFile" + fi + fi - if [ "$MYSQL_DATABASE" ]; then - echo "GRANT ALL ON \`"$MYSQL_DATABASE"\`.* TO '"$MYSQL_USER"'@'%' ;" >> "$tempSqlFile" + # Yet another user? + if [ "$user" ] || [ "$pass" ]; then + let ++i + else + break fi - fi + done echo 'FLUSH PRIVILEGES ;' >> "$tempSqlFile" From 46d7b40aecb7e0499a9a49c12a3c59a52c9d2e13 Mon Sep 17 00:00:00 2001 From: Victor Hahn Date: Sat, 11 Jul 2015 18:24:14 +0200 Subject: [PATCH 3/4] Port multiple database and user support to MySQL 5.5 and 5.6 --- 5.5/docker-entrypoint.sh | 84 +++++++++++++++++++++++++++++++++++----- 5.6/docker-entrypoint.sh | 84 +++++++++++++++++++++++++++++++++++----- 2 files changed, 150 insertions(+), 18 deletions(-) diff --git a/5.5/docker-entrypoint.sh b/5.5/docker-entrypoint.sh index e0cdba8c6..8a2be77cd 100755 --- a/5.5/docker-entrypoint.sh +++ b/5.5/docker-entrypoint.sh @@ -67,17 +67,83 @@ if [ "$1" = 'mysqld' ]; then DROP DATABASE IF EXISTS test ; EOSQL - if [ "$MYSQL_DATABASE" ]; then - echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" >> "$tempSqlFile" - fi - - if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then - echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" >> "$tempSqlFile" + # Create databases if specified on command line + i=0 + while : + do + if [ "$i" -eq "0" ]; then # support "legacy" option before multiple database support + this_varname=MYSQL_DATABASE + else + this_varname=MYSQL_DATABASE$i + fi + thisdb=${!this_varname} + + if [ "$thisdb" ]; then + echo "CREATE DATABASE IF NOT EXISTS \`$thisdb\` ;" >> "$tempSqlFile" + fi + + # Yet another DB? + if [ "$thisdb" ] || [ "$i" -eq "0" ]; then + let ++i + else + break + fi + done + + # Create users and grant them rights on the appropriate databases + # If no number is used this user is granted rights on *all* DBs. + if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then + echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" >> "$tempSqlFile" + + i=0 + while : + do + if [ "$i" -eq "0" ]; then # support "legacy" option before multiple database support + this_varname=MYSQL_DATABASE + else + this_varname=MYSQL_DATABASE$i + fi + + thisdb=${!this_varname} + if [ "$thisdb" ]; then + echo "GRANT ALL ON \`"$thisdb"\`.* TO '"$MYSQL_USER"'@'%' ;" >> "$tempSqlFile" + fi + + # Yet another DB? + if [ "$thisdb" ] || [ "$i" -eq "0" ]; then + let ++i + else + break + fi + done + fi + + # If numbers are used on user specification they get rights on the database with the same number + i=1 + while : + do + db_varname=MYSQL_DATABASE$i + user_varname=MYSQL_USER$i + pass_varname=MYSQL_PASSWORD$i + + db=${!db_varname} + user=${!user_varname} + pass=${!pass_varname} + + if [ "$user" -a "$pass" ]; then + echo "CREATE USER '"$user"'@'%' IDENTIFIED BY '"$pass"' ;" >> "$tempSqlFile" + if [ "$db" ]; then + echo "GRANT ALL ON \`"$db"\`.* TO '"$user"'@'%' ;" >> "$tempSqlFile" + fi + fi - if [ "$MYSQL_DATABASE" ]; then - echo "GRANT ALL ON \`"$MYSQL_DATABASE"\`.* TO '"$MYSQL_USER"'@'%' ;" >> "$tempSqlFile" + # Yet another user? + if [ "$user" ] || [ "$pass" ]; then + let ++i + else + break fi - fi + done echo 'FLUSH PRIVILEGES ;' >> "$tempSqlFile" diff --git a/5.6/docker-entrypoint.sh b/5.6/docker-entrypoint.sh index 6f011f660..cabd77590 100755 --- a/5.6/docker-entrypoint.sh +++ b/5.6/docker-entrypoint.sh @@ -67,17 +67,83 @@ if [ "$1" = 'mysqld' ]; then DROP DATABASE IF EXISTS test ; EOSQL - if [ "$MYSQL_DATABASE" ]; then - echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" >> "$tempSqlFile" - fi - - if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then - echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" >> "$tempSqlFile" + # Create databases if specified on command line + i=0 + while : + do + if [ "$i" -eq "0" ]; then # support "legacy" option before multiple database support + this_varname=MYSQL_DATABASE + else + this_varname=MYSQL_DATABASE$i + fi + thisdb=${!this_varname} + + if [ "$thisdb" ]; then + echo "CREATE DATABASE IF NOT EXISTS \`$thisdb\` ;" >> "$tempSqlFile" + fi + + # Yet another DB? + if [ "$thisdb" ] || [ "$i" -eq "0" ]; then + let ++i + else + break + fi + done + + # Create users and grant them rights on the appropriate databases + # If no number is used this user is granted rights on *all* DBs. + if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then + echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" >> "$tempSqlFile" + + i=0 + while : + do + if [ "$i" -eq "0" ]; then # support "legacy" option before multiple database support + this_varname=MYSQL_DATABASE + else + this_varname=MYSQL_DATABASE$i + fi + + thisdb=${!this_varname} + if [ "$thisdb" ]; then + echo "GRANT ALL ON \`"$thisdb"\`.* TO '"$MYSQL_USER"'@'%' ;" >> "$tempSqlFile" + fi + + # Yet another DB? + if [ "$thisdb" ] || [ "$i" -eq "0" ]; then + let ++i + else + break + fi + done + fi + + # If numbers are used on user specification they get rights on the database with the same number + i=1 + while : + do + db_varname=MYSQL_DATABASE$i + user_varname=MYSQL_USER$i + pass_varname=MYSQL_PASSWORD$i + + db=${!db_varname} + user=${!user_varname} + pass=${!pass_varname} + + if [ "$user" -a "$pass" ]; then + echo "CREATE USER '"$user"'@'%' IDENTIFIED BY '"$pass"' ;" >> "$tempSqlFile" + if [ "$db" ]; then + echo "GRANT ALL ON \`"$db"\`.* TO '"$user"'@'%' ;" >> "$tempSqlFile" + fi + fi - if [ "$MYSQL_DATABASE" ]; then - echo "GRANT ALL ON \`"$MYSQL_DATABASE"\`.* TO '"$MYSQL_USER"'@'%' ;" >> "$tempSqlFile" + # Yet another user? + if [ "$user" ] || [ "$pass" ]; then + let ++i + else + break fi - fi + done echo 'FLUSH PRIVILEGES ;' >> "$tempSqlFile" From ebc24f0286fcce0fe2ff8ead6b99029b4baae967 Mon Sep 17 00:00:00 2001 From: Victor Hahn Date: Sat, 11 Jul 2015 19:49:34 +0200 Subject: [PATCH 4/4] Allow to create separate users for only some databases --- 5.5/docker-entrypoint.sh | 2 +- 5.6/docker-entrypoint.sh | 2 +- 5.7/docker-entrypoint.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/5.5/docker-entrypoint.sh b/5.5/docker-entrypoint.sh index 8a2be77cd..2a42800f8 100755 --- a/5.5/docker-entrypoint.sh +++ b/5.5/docker-entrypoint.sh @@ -138,7 +138,7 @@ if [ "$1" = 'mysqld' ]; then fi # Yet another user? - if [ "$user" ] || [ "$pass" ]; then + if [ "$user" ] || [ "$pass" ] || [ "$db" ]; then let ++i else break diff --git a/5.6/docker-entrypoint.sh b/5.6/docker-entrypoint.sh index cabd77590..42206b7af 100755 --- a/5.6/docker-entrypoint.sh +++ b/5.6/docker-entrypoint.sh @@ -138,7 +138,7 @@ if [ "$1" = 'mysqld' ]; then fi # Yet another user? - if [ "$user" ] || [ "$pass" ]; then + if [ "$user" ] || [ "$pass" ] || [ "$db" ]; then let ++i else break diff --git a/5.7/docker-entrypoint.sh b/5.7/docker-entrypoint.sh index 12b263f6c..2608571a9 100755 --- a/5.7/docker-entrypoint.sh +++ b/5.7/docker-entrypoint.sh @@ -138,7 +138,7 @@ if [ "$1" = 'mysqld' ]; then fi # Yet another user? - if [ "$user" ] || [ "$pass" ]; then + if [ "$user" ] || [ "$pass" ] || [ "$db" ]; then let ++i else break