@@ -4,209 +4,202 @@ shopt -s nullglob
44
55# if command starts with an option, prepend mysqld
66if [ " ${1: 0: 1} " = ' -' ]; then
7- set -- mysqld " $@ "
7+ set -- mysqld " $@ "
88fi
99
1010# skip setup if they want an option that stops mysqld
1111wantHelp=
1212for arg; do
13- case " ${arg} " in
14- -' ?' |--help|--print-defaults|-V|--version)
15- wantHelp=1
16- break
17- ;;
18- esac
13+ case " ${arg} " in
14+ -' ?' |--help|--print-defaults|-V|--version)
15+ wantHelp=1
16+ break
17+ ;;
18+ esac
1919done
2020
2121# usage: file_env VAR [DEFAULT]
2222# ie: file_env 'XYZ_DB_PASSWORD' 'example'
2323# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
2424# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
2525file_env () {
26- local var=" $1 "
27- local fileVar=" ${var} _FILE"
28- local def=" ${2:- } "
29- if [ " ${! var:- } " ] && [ " ${! fileVar:- } " ]; then
30- echo >&2 " error: both ${var} and ${fileVar} are set (but are exclusive)"
31- exit 1
32- fi
33- local val=" ${def} "
34- if [ " ${! var:- } " ]; then
35- val=" ${! var} "
36- elif [ " ${! fileVar:- } " ]; then
37- val=" $( < " ${! fileVar} " ) "
38- fi
39- export " ${var} " =" ${val} "
40- unset " ${fileVar} "
26+ local var=" $1 "
27+ local fileVar=" ${var} _FILE"
28+ local def=" ${2:- } "
29+ if [ " ${! var:- } " ] && [ " ${! fileVar:- } " ]; then
30+ echo >&2 " error: both ${var} and ${fileVar} are set (but are exclusive)"
31+ exit 1
32+ fi
33+ local val=" ${def} "
34+ if [ " ${! var:- } " ]; then
35+ val=" ${! var} "
36+ elif [ " ${! fileVar:- } " ]; then
37+ val=" $( < " ${! fileVar} " ) "
38+ fi
39+ export " ${var} " =" ${val} "
40+ unset " ${fileVar} "
4141}
4242
4343_check_config () {
44- toRun=( " $@ " --verbose --help )
45- if ! errors=" $( " ${toRun[@]} " 2>&1 > /dev/null) " ; then
46- cat >&2 << -EOM
47-
48- ERROR: mysqld failed while attempting to check config
49- command was: "${toRun[*]} "
50-
51- ${errors}
52- EOM
53- exit 1
54- fi
55- }
44+ toRun=( " $@ " --verbose --help )
45+ if ! errors=" $( " ${toRun[@]} " 2>&1 > /dev/null) " ; then
46+ echo ' ERROR: mysqld failed while attempting to check config'
47+ echo " command was: '${toRun[*]} '"
48+ echo " ${errors} "
49+ exit 1
50+ fi >&2
51+ }
5652
5753# Fetch value from server config
5854# We use mysqld --verbose --help instead of my_print_defaults because the
5955# latter only show values present in config files, and not server defaults
6056_get_config () {
61- local conf=" $1 " ; shift
62- " $@ " --verbose --help --log-bin-index=" $( mktemp -u) " 2> /dev/null | awk ' $1 == "' " ${conf} " ' " { print $2; exit }'
57+ local conf=" $1 " ; shift
58+ " $@ " --verbose --help --log-bin-index=" $( mktemp -u) " 2> /dev/null | awk ' $1 == "' " ${conf} " ' " { print $2; exit }'
6359}
6460
6561# allow the container to be started with `--user`
6662if [ " $1 " = ' mysqld' -a -z " ${wantHelp} " -a " $( id -u) " = ' 0' ]; then
67- _check_config " $@ "
68- DATADIR=" $( _get_config ' datadir' " $@ " ) "
69- mkdir -p " ${DATADIR} "
70- chown -R mysql:mysql " ${DATADIR} "
63+ _check_config " $@ "
64+ DATADIR=" $( _get_config ' datadir' " $@ " ) "
65+ mkdir -p " ${DATADIR} "
66+ chown -R mysql:mysql " ${DATADIR} "
7167
72- if [ -f /root/pending-restore ]; then
73- /root/xrecovery-final.sh
74- fi
68+ if [ -f /root/pending-restore ]; then
69+ /root/xrecovery-final.sh
70+ fi
7571
76- exec gosu mysql " ${BASH_SOURCE} " " $@ "
72+ exec gosu mysql " ${BASH_SOURCE} " " $@ "
7773fi
7874
7975if [ " $1 " = ' mysqld' -a -z " ${wantHelp} " ]; then
80- # still need to check config, container may have started with --user
81- _check_config " $@ "
82- # Get config
83- DATADIR=" $( _get_config ' datadir' " $@ " ) "
84-
85- if [ ! -d " ${DATADIR} /mysql" ]; then
86- file_env ' MYSQL_ROOT_PASSWORD'
87- if [ -z " ${MYSQL_ROOT_PASSWORD} " -a -z " ${MYSQL_ALLOW_EMPTY_PASSWORD} " -a -z " ${MYSQL_RANDOM_ROOT_PASSWORD} " ]; then
88- echo >&2 ' error: database is uninitialized and password option is not specified '
89- echo >&2 ' You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD'
90- exit 1
91- fi
92-
93- mkdir -p " ${DATADIR} "
94-
95- echo ' Initializing database'
96- " $@ " --initialize-insecure
97- echo ' Database initialized'
98-
99- if command -v mysql_ssl_rsa_setup > /dev/null && [ ! -e " ${DATADIR} /server-key.pem" ]; then
100- # https://github.com/mysql/mysql-server/blob/23032807537d8dd8ee4ec1c4d40f0633cd4e12f9/packaging/deb-in/extra/mysql-systemd-start#L81-L84
101- echo ' Initializing certificates'
102- mysql_ssl_rsa_setup --datadir=" ${DATADIR} "
103- echo ' Certificates initialized'
104- fi
105-
106- SOCKET=" $( _get_config ' socket' " $@ " ) "
107- " $@ " --skip-networking --socket=" ${SOCKET} " &
108- pid=" $! "
109-
110- mysql=( mysql --protocol=socket -uroot -hlocalhost --socket=" ${SOCKET} " )
111-
112- for i in {30..0}; do
113- if echo ' SELECT 1' | " ${mysql[@]} " & > /dev/null; then
114- break
115- fi
116- echo ' MySQL init process in progress...'
117- sleep 1
118- done
119- if [ " ${i} " = 0 ]; then
120- echo >&2 ' MySQL init process failed.'
121- exit 1
122- fi
123-
124- if [ -z " ${MYSQL_INITDB_SKIP_TZINFO} " ]; then
125- # sed is for https://bugs.mysql.com/bug.php?id=20545
126- mysql_tzinfo_to_sql /usr/share/zoneinfo | sed ' s/Local time zone must be set--see zic manual page/FCTY/' | " ${mysql[@]} " mysql
127- fi
128-
129- if [ ! -z " ${MYSQL_RANDOM_ROOT_PASSWORD} " ]; then
130- export MYSQL_ROOT_PASSWORD=" $( pwgen -1 32) "
131- echo " GENERATED ROOT PASSWORD: ${MYSQL_ROOT_PASSWORD} "
132- fi
133-
134- rootCreate=
135- # default root to listen for connections from anywhere
136- file_env ' MYSQL_ROOT_HOST' ' %'
137- if [ ! -z " ${MYSQL_ROOT_HOST} " -a " ${MYSQL_ROOT_HOST} " != ' localhost' ]; then
138- # no, we don't care if read finds a terminating character in this heredoc
139- # https://unix.stackexchange.com/questions/265149/why-is-set-o-errexit-breaking-this-read-heredoc-expression/265151#265151
140- read -r -d ' ' rootCreate << -EOSQL || true
141- CREATE USER 'root'@'${MYSQL_ROOT_HOST} ' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD} ' ;
142- GRANT ALL ON *.* TO 'root'@'${MYSQL_ROOT_HOST} ' WITH GRANT OPTION ;
143- EOSQL
144- fi
145-
146- " ${mysql[@]} " << -EOSQL
147- -- What's done in this file shouldn't be replicated
148- -- or products like mysql-fabric won't work
149- SET @@SESSION.SQL_LOG_BIN=0;
150-
151- DELETE FROM mysql.user WHERE user NOT IN ('mysql.sys', 'mysqlxsys', 'root') OR host NOT IN ('localhost') ;
152- SET PASSWORD FOR 'root'@'localhost'=PASSWORD('${MYSQL_ROOT_PASSWORD} ') ;
153- GRANT ALL ON *.* TO 'root'@'localhost' WITH GRANT OPTION ;
154- ${rootCreate}
155- DROP DATABASE IF EXISTS test ;
156- FLUSH PRIVILEGES ;
157- EOSQL
158-
159- if [ ! -z " ${MYSQL_ROOT_PASSWORD} " ]; then
160- mysql+=( -p" ${MYSQL_ROOT_PASSWORD} " )
161- fi
162-
163- file_env ' MYSQL_DATABASE'
164- if [ " ${MYSQL_DATABASE} " ]; then
165- echo " CREATE DATABASE IF NOT EXISTS \` ${MYSQL_DATABASE} \` ;" | " ${mysql[@]} "
166- mysql+=( " ${MYSQL_DATABASE} " )
167- fi
168-
169- file_env ' MYSQL_USER'
170- file_env ' MYSQL_PASSWORD'
171- if [ " ${MYSQL_USER} " -a " ${MYSQL_PASSWORD} " ]; then
172- echo " CREATE USER '${MYSQL_USER} '@'%' IDENTIFIED BY '${MYSQL_PASSWORD} ' ;" | " ${mysql[@]} "
173-
174- if [ " ${MYSQL_DATABASE} " ]; then
175- echo " GRANT ALL ON \` ${MYSQL_DATABASE} \` .* TO '${MYSQL_USER} '@'%' ;" | " ${mysql[@]} "
176- fi
177-
178- echo ' FLUSH PRIVILEGES ;' | " ${mysql[@]} "
179- fi
180-
181- echo
182- for f in /docker-entrypoint-initdb.d/* ; do
183- case " ${f} " in
184- * .sh) echo " $0 : running ${f} " ; . " ${f} " ;;
185- * .sql) echo " $0 : running ${f} " ; " ${mysql[@]} " < " ${f} " ; echo ;;
186- * .sql.gz) echo " $0 : running ${f} " ; gunzip -c " ${f} " | " ${mysql[@]} " ; echo ;;
187- * ) echo " $0 : ignoring ${f} " ;;
188- esac
189- echo
190- done
191-
192- if [ ! -z " ${MYSQL_ONETIME_PASSWORD} " ]; then
193- " ${mysql[@]} " << -EOSQL
194- ALTER USER 'root'@'%' PASSWORD EXPIRE;
195- EOSQL
196- fi
197- if ! kill -s TERM " ${pid} " || ! wait " ${pid} " ; then
198- echo >&2 ' MySQL init process failed.'
199- exit 1
200- fi
201-
202- echo
203- echo ' MySQL init process done. Ready for start up.'
204- echo
205- fi
76+ # still need to check config, container may have started with --user
77+ _check_config " $@ "
78+ # Get config
79+ DATADIR=" $( _get_config ' datadir' " $@ " ) "
80+
81+ if [ ! -d " ${DATADIR} /mysql" ]; then
82+ file_env ' MYSQL_ROOT_PASSWORD'
83+ if [ -z " ${MYSQL_ROOT_PASSWORD} " -a -z " ${MYSQL_ALLOW_EMPTY_PASSWORD} " -a -z " ${MYSQL_RANDOM_ROOT_PASSWORD} " ]; then
84+ echo >&2 ' error: database is uninitialized and password option is not specified '
85+ echo >&2 ' You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD'
86+ exit 1
87+ fi
88+
89+ mkdir -p " ${DATADIR} "
90+
91+ echo ' Initializing database'
92+ " $@ " --initialize-insecure
93+ echo ' Database initialized'
94+
95+ if command -v mysql_ssl_rsa_setup > /dev/null && [ ! -e " ${DATADIR} /server-key.pem" ]; then
96+ # https://github.com/mysql/mysql-server/blob/23032807537d8dd8ee4ec1c4d40f0633cd4e12f9/packaging/deb-in/extra/mysql-systemd-start#L81-L84
97+ echo ' Initializing certificates'
98+ mysql_ssl_rsa_setup --datadir=" ${DATADIR} "
99+ echo ' Certificates initialized'
100+ fi
101+
102+ SOCKET=" $( _get_config ' socket' " $@ " ) "
103+ " $@ " --skip-networking --socket=" ${SOCKET} " &
104+ pid=" $! "
105+
106+ mysql=( mysql --protocol=socket -uroot -hlocalhost --socket=" ${SOCKET} " )
107+
108+ for i in {30..0}; do
109+ if echo ' SELECT 1' | " ${mysql[@]} " & > /dev/null; then
110+ break
111+ fi
112+ echo ' MySQL init process in progress...'
113+ sleep 1
114+ done
115+ if [ " ${i} " = 0 ]; then
116+ echo >&2 ' MySQL init process failed.'
117+ exit 1
118+ fi
119+
120+ if [ -z " ${MYSQL_INITDB_SKIP_TZINFO} " ]; then
121+ # sed is for https://bugs.mysql.com/bug.php?id=20545
122+ mysql_tzinfo_to_sql /usr/share/zoneinfo | sed ' s/Local time zone must be set--see zic manual page/FCTY/' | " ${mysql[@]} " mysql
123+ fi
124+
125+ if [ ! -z " ${MYSQL_RANDOM_ROOT_PASSWORD} " ]; then
126+ export MYSQL_ROOT_PASSWORD=" $( pwgen -1 32) "
127+ echo " GENERATED ROOT PASSWORD: ${MYSQL_ROOT_PASSWORD} "
128+ fi
129+
130+ rootCreate=()
131+ # default root to listen for connections from anywhere
132+ file_env ' MYSQL_ROOT_HOST' ' %'
133+ if [ ! -z " ${MYSQL_ROOT_HOST} " -a " ${MYSQL_ROOT_HOST} " != ' localhost' ]; then
134+ rootCreate=(
135+ " CREATE USER 'root'@'${MYSQL_ROOT_HOST} ' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD} ';"
136+ " GRANT ALL ON *.* TO 'root'@'${MYSQL_ROOT_HOST} ' WITH GRANT OPTION;"
137+ )
138+ fi
139+
140+ sql=(
141+ " -- What's done in this file shouldn't be replicated"
142+ " -- or products like mysql-fabric won't work"
143+ ' SET @@SESSION.SQL_LOG_BIN=0;'
144+ " DELETE FROM mysql.user WHERE user NOT IN ('mysql.sys', 'mysqlxsys', 'root') OR host NOT IN ('localhost');"
145+ " SET PASSWORD FOR 'root'@'localhost'=PASSWORD('${MYSQL_ROOT_PASSWORD} ');"
146+ " GRANT ALL ON *.* TO 'root'@'localhost' WITH GRANT OPTION;"
147+ " ${rootCreate[@]} "
148+ ' DROP DATABASE IF EXISTS test;'
149+ ' FLUSH PRIVILEGES;'
150+ )
151+
152+ printf ' %s\n' " ${sql[@]} " | " ${mysql[@]} "
153+
154+ if [ ! -z " ${MYSQL_ROOT_PASSWORD} " ]; then
155+ mysql+=( -p" ${MYSQL_ROOT_PASSWORD} " )
156+ fi
157+
158+ file_env ' MYSQL_DATABASE'
159+ if [ " ${MYSQL_DATABASE} " ]; then
160+ echo " CREATE DATABASE IF NOT EXISTS \` ${MYSQL_DATABASE} \` ;" | " ${mysql[@]} "
161+ mysql+=( " ${MYSQL_DATABASE} " )
162+ fi
163+
164+ file_env ' MYSQL_USER'
165+ file_env ' MYSQL_PASSWORD'
166+ if [ " ${MYSQL_USER} " -a " ${MYSQL_PASSWORD} " ]; then
167+ echo " CREATE USER '${MYSQL_USER} '@'%' IDENTIFIED BY '${MYSQL_PASSWORD} ' ;" | " ${mysql[@]} "
168+
169+ if [ " ${MYSQL_DATABASE} " ]; then
170+ echo " GRANT ALL ON \` ${MYSQL_DATABASE} \` .* TO '${MYSQL_USER} '@'%' ;" | " ${mysql[@]} "
171+ fi
172+
173+ echo ' FLUSH PRIVILEGES ;' | " ${mysql[@]} "
174+ fi
175+
176+ echo
177+ for f in /docker-entrypoint-initdb.d/* ; do
178+ case " ${f} " in
179+ * .sh) echo " $0 : running ${f} " ; . " ${f} " ;;
180+ * .sql) echo " $0 : running ${f} " ; " ${mysql[@]} " < " ${f} " ; echo ;;
181+ * .sql.gz) echo " $0 : running ${f} " ; gunzip -c " ${f} " | " ${mysql[@]} " ; echo ;;
182+ * ) echo " $0 : ignoring ${f} " ;;
183+ esac
184+ echo
185+ done
186+
187+ if [ ! -z " ${MYSQL_ONETIME_PASSWORD} " ]; then
188+ " ${mysql[@]} " <<< " ALTER USER 'root'@'%' PASSWORD EXPIRE;"
189+ fi
190+ if ! kill -s TERM " ${pid} " || ! wait " ${pid} " ; then
191+ echo >&2 ' MySQL init process failed.'
192+ exit 1
193+ fi
194+
195+ echo
196+ echo ' MySQL init process done. Ready for start up.'
197+ echo
198+ fi
206199fi
207200
208201if [ -f /root/pending-restore ]; then
209- /root/xrecovery-final.sh
202+ /root/xrecovery-final.sh
210203fi
211204
212205
0 commit comments