1
1
#! /bin/bash
2
2
set -e
3
3
4
- get_option () {
5
- local section=$1
6
- local option=$2
7
- local default=$3
8
- ret=$( my_print_defaults $section | grep ' ^--' ${option} ' =' | cut -d= -f2-)
9
- [ -z $ret ] && ret=$default
10
- echo $ret
11
- }
12
-
4
+ # if command starts with an option, prepend mysqld
13
5
if [ " ${1: 0: 1} " = ' -' ]; then
14
6
set -- mysqld " $@ "
15
7
fi
16
8
17
9
if [ " $1 " = ' mysqld' ]; then
18
10
# Get config
19
- DATADIR=" $( " $@ " --verbose --help 2> /dev/null | awk ' $1 == "datadir" { print $2; exit }' ) "
20
- SOCKET=$( get_option mysqld socket " $DATADIR /mysql.sock" )
21
- PIDFILE=$( get_option mysqld pid-file " /var/lib/mysql/mysqld.pid" )
11
+ DATADIR=" $( " $@ " --verbose --help --innodb-read-only 2> /dev/null | awk ' $1 == "datadir" { print $2; exit }' ) "
22
12
23
13
if [ ! -d " $DATADIR /mysql" ]; then
24
14
if [ -z " $MYSQL_ROOT_PASSWORD " -a -z " $MYSQL_ALLOW_EMPTY_PASSWORD " ]; then
@@ -27,69 +17,82 @@ if [ "$1" = 'mysqld' ]; then
27
17
exit 1
28
18
fi
29
19
mkdir -p /var/lib/mysql-files
30
- if [ ! -d " $DATADIR " ]; then
31
- mkdir -p $DATADIR
32
- fi
20
+ mkdir -p " $DATADIR "
33
21
chown -R mysql:mysql " $DATADIR "
34
22
35
23
echo ' Initializing database'
36
- mysqld --initialize-insecure=on --datadir=$DATADIR
24
+ mysqld --initialize-insecure=on --user=mysql -- datadir=" $DATADIR "
37
25
echo ' Database initialized'
38
26
39
- mysqld --user=mysql --datadir=$DATADIR --skip-networking &
40
- for i in $( seq 30 -1 0) ; do
41
- [ -S $SOCKET ] && break
27
+ mysqld --user=mysql --datadir=" $DATADIR " --skip-networking &
28
+ pid=" $! "
29
+
30
+ mysql=( mysql --protocol=socket -uroot )
31
+
32
+ for i in {30..0}; do
33
+ if echo ' SELECT 1' | " ${mysql[@]} " & > /dev/null; then
34
+ break
35
+ fi
42
36
echo ' MySQL init process in progress...'
43
37
sleep 1
44
38
done
45
- if [ $i = 0 ]; then
39
+ if [ " $i " = 0 ]; then
46
40
echo >&2 ' MySQL init process failed.'
47
41
exit 1
48
42
fi
49
43
50
- # These statements _must_ be on individual lines, and _must_ end with
51
- # semicolons (no line breaks or comments are permitted).
52
- # TODO proper SQL escaping on ALL the things D:
44
+ mysql_tzinfo_to_sql /usr/share/zoneinfo | " ${mysql[@]} " mysql
53
45
54
- tempSqlFile=$( mktemp /tmp/mysql-first-time.XXXXXX.sql)
55
- cat > " $tempSqlFile " << -EOSQL
46
+ " ${mysql[@]} " << -EOSQL
56
47
-- What's done in this file shouldn't be replicated
48
+ -- or products like mysql-fabric won't work
57
49
SET @@SESSION.SQL_LOG_BIN=0;
58
50
DELETE FROM mysql.user ;
59
51
CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD} ' ;
60
52
GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;
61
53
DROP DATABASE IF EXISTS test ;
54
+ FLUSH PRIVILEGES ;
62
55
EOSQL
56
+ if [ ! -z " $MYSQL_ROOT_PASSWORD " ]; then
57
+ mysql+=( -p" ${MYSQL_ROOT_PASSWORD} " )
58
+ fi
63
59
64
60
if [ " $MYSQL_DATABASE " ]; then
65
- echo " CREATE DATABASE IF NOT EXISTS \` " $MYSQL_DATABASE " \` ;" >> " $tempSqlFile "
61
+ echo " CREATE DATABASE IF NOT EXISTS \` $MYSQL_DATABASE \` ;" | " ${mysql[@]} "
62
+ mysql+=( " $MYSQL_DATABASE " )
66
63
fi
67
64
68
65
if [ " $MYSQL_USER " -a " $MYSQL_PASSWORD " ]; then
69
- echo " CREATE USER '" $MYSQL_USER " '@'%' IDENTIFIED BY '" $MYSQL_PASSWORD " ' ;" >> " $tempSqlFile "
66
+ echo " CREATE USER '" $MYSQL_USER " '@'%' IDENTIFIED BY '" $MYSQL_PASSWORD " ' ;" | " ${mysql[@]} "
70
67
71
68
if [ " $MYSQL_DATABASE " ]; then
72
- echo " GRANT ALL ON \` " $MYSQL_DATABASE " \` .* TO '" $MYSQL_USER " '@'%' ;" >> " $tempSqlFile "
69
+ echo " GRANT ALL ON \` " $MYSQL_DATABASE " \` .* TO '" $MYSQL_USER " '@'%' ;" | " ${mysql[@]} "
73
70
fi
74
- fi
75
71
76
- echo ' FLUSH PRIVILEGES ;' >> " $tempSqlFile "
77
- echo " Running init sql script."
78
- mysql -uroot < $tempSqlFile
72
+ echo ' FLUSH PRIVILEGES ;' | " ${mysql[@]} "
73
+ fi
79
74
80
- rm -f $tempSqlFile
81
- kill $( cat $PIDFILE )
82
- for i in $( seq 30 -1 0) ; do
83
- [ -f " $PIDFILE " ] || break
84
- echo ' MySQL shutdown in progress...'
85
- sleep 1
75
+ echo
76
+ for f in /docker-entrypoint-initdb.d/* ; do
77
+ case " $f " in
78
+ * .sh) echo " $0 : running $f " ; . " $f " ;;
79
+ * .sql) echo " $0 : running $f " ; " ${mysql[@]} " < " $f " && echo ;;
80
+ * ) echo " $0 : ignoring $f " ;;
81
+ esac
82
+ echo
86
83
done
87
- if [ $i = 0 ]; then
88
- echo >&2 ' MySQL hangs during init process.'
84
+
85
+ if ! kill -s TERM " $pid " || ! wait " $pid " ; then
86
+ echo >&2 ' MySQL init process failed.'
89
87
exit 1
90
88
fi
89
+
90
+ echo
91
91
echo ' MySQL init process done. Ready for start up.'
92
+ echo
92
93
fi
94
+
95
+ chown -R mysql:mysql " $DATADIR "
93
96
fi
94
97
95
98
exec " $@ "
0 commit comments