entrypoint.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #!/bin/bash
  2. set -e
  3. echo WAIT 10 sec
  4. sleep 10
  5. # if command starts with an option, prepend mysqld
  6. if [ "${1:0:1}" = '-' ]; then
  7. set -- mysqld "$@"
  8. fi
  9. if [ "$1" = 'mysqld' ]; then
  10. # Get config
  11. DATADIR="$("$@" --verbose --help --log-bin-index=/tmp/tmp.index 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')"
  12. if [ ! -d "$DATADIR/mysql" ]; then
  13. if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
  14. echo >&2 'error: database is uninitialized and password option is not specified '
  15. echo >&2 ' You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD'
  16. exit 1
  17. fi
  18. # If the password variable is a filename we use the contents of the file
  19. if [ -f "$MYSQL_ROOT_PASSWORD" ]; then
  20. MYSQL_ROOT_PASSWORD="$(cat $MYSQL_ROOT_PASSWORD)"
  21. fi
  22. mkdir -p "$DATADIR"
  23. chown -R mysql:mysql "$DATADIR"
  24. echo 'Initializing database'
  25. mysqld --initialize-insecure=on --user=mysql --datadir="$DATADIR"
  26. echo 'Database initialized'
  27. mysqld --user=mysql --datadir="$DATADIR" --skip-networking &
  28. pid="$!"
  29. mysql=( mysql --protocol=socket -uroot )
  30. for i in {30..0}; do
  31. if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then
  32. break
  33. fi
  34. echo 'MySQL init process in progress...'
  35. sleep 1
  36. done
  37. if [ "$i" = 0 ]; then
  38. echo >&2 'MySQL init process failed.'
  39. exit 1
  40. fi
  41. mysql_tzinfo_to_sql /usr/share/zoneinfo | "${mysql[@]}" mysql
  42. if [ ! -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
  43. MYSQL_ROOT_PASSWORD="$(pwmake 128)"
  44. echo "GENERATED ROOT PASSWORD: $MYSQL_ROOT_PASSWORD"
  45. fi
  46. "${mysql[@]}" <<-EOSQL
  47. -- What's done in this file shouldn't be replicated
  48. -- or products like mysql-fabric won't work
  49. SET @@SESSION.SQL_LOG_BIN=0;
  50. DELETE FROM mysql.user where user != 'mysql.sys';
  51. CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;
  52. GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;
  53. DROP DATABASE IF EXISTS test ;
  54. FLUSH PRIVILEGES ;
  55. EOSQL
  56. if [ ! -z "$MYSQL_ROOT_PASSWORD" ]; then
  57. mysql+=( -p"${MYSQL_ROOT_PASSWORD}" )
  58. fi
  59. if [ "$MYSQL_DATABASE" ]; then
  60. echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"
  61. mysql+=( "$MYSQL_DATABASE" )
  62. fi
  63. if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then
  64. echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" | "${mysql[@]}"
  65. if [ "$MYSQL_DATABASE" ]; then
  66. echo "GRANT ALL ON \`"$MYSQL_DATABASE"\`.* TO '"$MYSQL_USER"'@'%' ;" | "${mysql[@]}"
  67. fi
  68. echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}"
  69. fi
  70. echo
  71. for f in /docker-entrypoint-initdb.d/*; do
  72. case "$f" in
  73. *.sh) echo "$0: running $f"; . "$f" ;;
  74. *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f" && echo ;;
  75. *) echo "$0: ignoring $f" ;;
  76. esac
  77. echo
  78. done
  79. if [ ! -z "$MYSQL_ONETIME_PASSWORD" ]; then
  80. "${mysql[@]}" <<-EOSQL
  81. ALTER USER 'root'@'%' PASSWORD EXPIRE;
  82. EOSQL
  83. fi
  84. if ! kill -s TERM "$pid" || ! wait "$pid"; then
  85. echo >&2 'MySQL init process failed.'
  86. exit 1
  87. fi
  88. echo
  89. echo 'MySQL init process done. Ready for start up.'
  90. echo
  91. fi
  92. chown -R mysql:mysql "$DATADIR"
  93. fi
  94. exec "$@"