123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #!/bin/bash
- set -e
- if [ ! -z "$DOCKER_START_DELAY" ] ; then
- sleep $DOCKER_START_DELAY
- fi
- # if command starts with an option, prepend mysqld
- if [ "${1:0:1}" = '-' ]; then
- set -- mysqld "$@"
- fi
- if [ "$1" = 'mysqld' ]; then
- # Get config
- DATADIR="$("$@" --verbose --help --log-bin-index=/tmp/tmp.index 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')"
- if [ ! -d "$DATADIR/mysql" ]; then
- if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
- echo >&2 'error: database is uninitialized and password option is not specified '
- echo >&2 ' You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD'
- exit 1
- fi
- # If the password variable is a filename we use the contents of the file
- if [ -f "$MYSQL_ROOT_PASSWORD" ]; then
- MYSQL_ROOT_PASSWORD="$(cat $MYSQL_ROOT_PASSWORD)"
- fi
- mkdir -p "$DATADIR"
- chown -R mysql:mysql "$DATADIR"
- echo 'Initializing database'
- mysqld --initialize-insecure=on --user=mysql --datadir="$DATADIR"
- echo 'Database initialized'
- mysqld --user=mysql --datadir="$DATADIR" --skip-networking &
- pid="$!"
- mysql=( mysql --protocol=socket -uroot )
- for i in {30..0}; do
- if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then
- break
- fi
- echo 'MySQL init process in progress...'
- sleep 1
- done
- if [ "$i" = 0 ]; then
- echo >&2 'MySQL init process failed.'
- exit 1
- fi
- mysql_tzinfo_to_sql /usr/share/zoneinfo | "${mysql[@]}" mysql
-
- if [ ! -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
- MYSQL_ROOT_PASSWORD="$(pwmake 128)"
- echo "GENERATED ROOT PASSWORD: $MYSQL_ROOT_PASSWORD"
- fi
- "${mysql[@]}" <<-EOSQL
- -- What's done in this file shouldn't be replicated
- -- or products like mysql-fabric won't work
- SET @@SESSION.SQL_LOG_BIN=0;
- DELETE FROM mysql.user where user != 'mysql.sys';
- CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;
- GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;
- DROP DATABASE IF EXISTS test ;
- FLUSH PRIVILEGES ;
- EOSQL
- if [ ! -z "$MYSQL_ROOT_PASSWORD" ]; then
- mysql+=( -p"${MYSQL_ROOT_PASSWORD}" )
- fi
- if [ "$MYSQL_DATABASE" ]; then
- echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"
- mysql+=( "$MYSQL_DATABASE" )
- fi
- if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then
- echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" | "${mysql[@]}"
- if [ "$MYSQL_DATABASE" ]; then
- echo "GRANT ALL ON \`"$MYSQL_DATABASE"\`.* TO '"$MYSQL_USER"'@'%' ;" | "${mysql[@]}"
- fi
- echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}"
- fi
- echo
- for f in /docker-entrypoint-initdb.d/*; do
- case "$f" in
- *.sh) echo "$0: running $f"; . "$f" ;;
- *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f" && echo ;;
- *) echo "$0: ignoring $f" ;;
- esac
- echo
- done
- if [ ! -z "$MYSQL_ONETIME_PASSWORD" ]; then
- "${mysql[@]}" <<-EOSQL
- ALTER USER 'root'@'%' PASSWORD EXPIRE;
- EOSQL
- fi
- if ! kill -s TERM "$pid" || ! wait "$pid"; then
- echo >&2 'MySQL init process failed.'
- exit 1
- fi
- echo
- echo 'MySQL init process done. Ready for start up.'
- echo
- fi
- chown -R mysql:mysql "$DATADIR"
- fi
- exec "$@"
|