Skip to content

Commit aba6260

Browse files
committed
Merge pull request #18 from infosiftr/initdb
Resync Dockerfile and docker-entrypoint.sh with changes in mysql, especially for initdb
2 parents 327f1fd + 0196e31 commit aba6260

6 files changed

+231
-75
lines changed

10.0/Dockerfile

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ FROM debian:jessie
44
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
55
RUN groupadd -r mysql && useradd -r -g mysql mysql
66

7+
RUN mkdir /docker-entrypoint-initdb.d
8+
79
RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 199369E5404BD5FC7D2FE43BCBCB082A1BB943DB
810

911
ENV MARIADB_MAJOR 10.0
@@ -18,6 +20,8 @@ RUN echo "deb http://ftp.osuosl.org/pub/mariadb/repo/$MARIADB_MAJOR/debian jessi
1820
# add repository pinning to make sure dependencies from this MariaDB repo are preferred over Debian dependencies
1921
# libmariadbclient18 : Depends: libmysqlclient18 (= 5.5.42+maria-1~wheezy) but 5.5.43-0+deb7u1 is to be installed
2022

23+
# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
24+
# also, we set debconf keys to make APT a little quieter
2125
RUN { \
2226
echo mariadb-server-$MARIADB_MAJOR mysql-server/root_password password 'unused'; \
2327
echo mariadb-server-$MARIADB_MAJOR mysql-server/root_password_again password 'unused'; \
@@ -27,8 +31,13 @@ RUN { \
2731
mariadb-server=$MARIADB_VERSION \
2832
&& rm -rf /var/lib/apt/lists/* \
2933
&& rm -rf /var/lib/mysql \
30-
&& mkdir /var/lib/mysql \
31-
&& sed -ri 's/^(bind-address|skip-networking)/;\1/' /etc/mysql/my.cnf
34+
&& mkdir /var/lib/mysql
35+
36+
# comment out a few problematic configuration values
37+
# don't reverse lookup hostnames, they are usually another container
38+
RUN sed -Ei 's/^(bind-address|log)/#&/' /etc/mysql/my.cnf \
39+
&& echo 'skip-host-cache\nskip-name-resolve' | awk '{ print } $1 == "[mysqld]" && c == 0 { c = 1; system("cat") }' /etc/mysql/my.cnf > /tmp/my.cnf \
40+
&& mv /tmp/my.cnf /etc/mysql/my.cnf
3241

3342
VOLUME /var/lib/mysql
3443

10.0/docker-entrypoint.sh

Lines changed: 66 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,97 @@
11
#!/bin/bash
22
set -e
33

4+
# if command starts with an option, prepend mysqld
45
if [ "${1:0:1}" = '-' ]; then
56
set -- mysqld "$@"
67
fi
78

89
if [ "$1" = 'mysqld' ]; then
9-
# read DATADIR from the MySQL config
10+
# Get config
1011
DATADIR="$("$@" --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')"
11-
12+
1213
if [ ! -d "$DATADIR/mysql" ]; then
1314
if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" ]; then
1415
echo >&2 'error: database is uninitialized and MYSQL_ROOT_PASSWORD not set'
1516
echo >&2 ' Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?'
1617
exit 1
1718
fi
18-
19-
echo 'Running mysql_install_db ...'
20-
mysql_install_db --datadir="$DATADIR"
19+
20+
mkdir -p "$DATADIR"
21+
chown -R mysql:mysql "$DATADIR"
22+
23+
echo 'Running mysql_install_db'
24+
mysql_install_db --user=mysql --datadir="$DATADIR" --rpm
2125
echo 'Finished mysql_install_db'
22-
23-
# These statements _must_ be on individual lines, and _must_ end with
24-
# semicolons (no line breaks or comments are permitted).
25-
# TODO proper SQL escaping on ALL the things D:
26-
27-
tempSqlFile='/tmp/mysql-first-time.sql'
28-
cat > "$tempSqlFile" <<-EOSQL
26+
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
36+
echo 'MySQL init process in progress...'
37+
sleep 1
38+
done
39+
if [ "$i" = 0 ]; then
40+
echo >&2 'MySQL init process failed.'
41+
exit 1
42+
fi
43+
44+
# sed is for https://bugs.mysql.com/bug.php?id=20545
45+
mysql_tzinfo_to_sql /usr/share/zoneinfo | sed 's/Local time zone must be set--see zic manual page/FCTY/' | "${mysql[@]}" mysql
46+
47+
"${mysql[@]}" <<-EOSQL
48+
-- What's done in this file shouldn't be replicated
49+
-- or products like mysql-fabric won't work
50+
SET @@SESSION.SQL_LOG_BIN=0;
51+
2952
DELETE FROM mysql.user ;
3053
CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;
3154
GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;
3255
DROP DATABASE IF EXISTS test ;
56+
FLUSH PRIVILEGES ;
3357
EOSQL
34-
58+
mysql+=( -p"${MYSQL_ROOT_PASSWORD}" )
59+
3560
if [ "$MYSQL_DATABASE" ]; then
36-
echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" >> "$tempSqlFile"
61+
echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"
62+
mysql+=( "$MYSQL_DATABASE" )
3763
fi
38-
64+
3965
if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then
40-
echo "CREATE USER '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD' ;" >> "$tempSqlFile"
41-
66+
echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" | "${mysql[@]}"
67+
4268
if [ "$MYSQL_DATABASE" ]; then
43-
echo "GRANT ALL ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_USER'@'%' ;" >> "$tempSqlFile"
69+
echo "GRANT ALL ON \`"$MYSQL_DATABASE"\`.* TO '"$MYSQL_USER"'@'%' ;" | "${mysql[@]}"
4470
fi
71+
72+
echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}"
4573
fi
46-
47-
echo 'FLUSH PRIVILEGES ;' >> "$tempSqlFile"
48-
49-
set -- "$@" --init-file="$tempSqlFile"
74+
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
83+
done
84+
85+
if ! kill -s TERM "$pid" || ! wait "$pid"; then
86+
echo >&2 'MySQL init process failed.'
87+
exit 1
88+
fi
89+
90+
echo
91+
echo 'MySQL init process done. Ready for start up.'
92+
echo
5093
fi
51-
94+
5295
chown -R mysql:mysql "$DATADIR"
5396
fi
5497

5.5/Dockerfile

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ FROM debian:wheezy
44
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
55
RUN groupadd -r mysql && useradd -r -g mysql mysql
66

7+
RUN mkdir /docker-entrypoint-initdb.d
8+
79
RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 199369E5404BD5FC7D2FE43BCBCB082A1BB943DB
810

911
ENV MARIADB_MAJOR 5.5
@@ -18,6 +20,8 @@ RUN echo "deb http://ftp.osuosl.org/pub/mariadb/repo/$MARIADB_MAJOR/debian wheez
1820
# add repository pinning to make sure dependencies from this MariaDB repo are preferred over Debian dependencies
1921
# libmariadbclient18 : Depends: libmysqlclient18 (= 5.5.42+maria-1~wheezy) but 5.5.43-0+deb7u1 is to be installed
2022

23+
# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
24+
# also, we set debconf keys to make APT a little quieter
2125
RUN { \
2226
echo mariadb-server-$MARIADB_MAJOR mysql-server/root_password password 'unused'; \
2327
echo mariadb-server-$MARIADB_MAJOR mysql-server/root_password_again password 'unused'; \
@@ -27,8 +31,13 @@ RUN { \
2731
mariadb-server=$MARIADB_VERSION \
2832
&& rm -rf /var/lib/apt/lists/* \
2933
&& rm -rf /var/lib/mysql \
30-
&& mkdir /var/lib/mysql \
31-
&& sed -ri 's/^(bind-address|skip-networking)/;\1/' /etc/mysql/my.cnf
34+
&& mkdir /var/lib/mysql
35+
36+
# comment out a few problematic configuration values
37+
# don't reverse lookup hostnames, they are usually another container
38+
RUN sed -Ei 's/^(bind-address|log)/#&/' /etc/mysql/my.cnf \
39+
&& echo 'skip-host-cache\nskip-name-resolve' | awk '{ print } $1 == "[mysqld]" && c == 0 { c = 1; system("cat") }' /etc/mysql/my.cnf > /tmp/my.cnf \
40+
&& mv /tmp/my.cnf /etc/mysql/my.cnf
3241

3342
VOLUME /var/lib/mysql
3443

5.5/docker-entrypoint.sh

Lines changed: 66 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,97 @@
11
#!/bin/bash
22
set -e
33

4+
# if command starts with an option, prepend mysqld
45
if [ "${1:0:1}" = '-' ]; then
56
set -- mysqld "$@"
67
fi
78

89
if [ "$1" = 'mysqld' ]; then
9-
# read DATADIR from the MySQL config
10+
# Get config
1011
DATADIR="$("$@" --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')"
11-
12+
1213
if [ ! -d "$DATADIR/mysql" ]; then
1314
if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" ]; then
1415
echo >&2 'error: database is uninitialized and MYSQL_ROOT_PASSWORD not set'
1516
echo >&2 ' Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?'
1617
exit 1
1718
fi
18-
19-
echo 'Running mysql_install_db ...'
20-
mysql_install_db --datadir="$DATADIR"
19+
20+
mkdir -p "$DATADIR"
21+
chown -R mysql:mysql "$DATADIR"
22+
23+
echo 'Running mysql_install_db'
24+
mysql_install_db --user=mysql --datadir="$DATADIR" --rpm
2125
echo 'Finished mysql_install_db'
22-
23-
# These statements _must_ be on individual lines, and _must_ end with
24-
# semicolons (no line breaks or comments are permitted).
25-
# TODO proper SQL escaping on ALL the things D:
26-
27-
tempSqlFile='/tmp/mysql-first-time.sql'
28-
cat > "$tempSqlFile" <<-EOSQL
26+
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
36+
echo 'MySQL init process in progress...'
37+
sleep 1
38+
done
39+
if [ "$i" = 0 ]; then
40+
echo >&2 'MySQL init process failed.'
41+
exit 1
42+
fi
43+
44+
# sed is for https://bugs.mysql.com/bug.php?id=20545
45+
mysql_tzinfo_to_sql /usr/share/zoneinfo | sed 's/Local time zone must be set--see zic manual page/FCTY/' | "${mysql[@]}" mysql
46+
47+
"${mysql[@]}" <<-EOSQL
48+
-- What's done in this file shouldn't be replicated
49+
-- or products like mysql-fabric won't work
50+
SET @@SESSION.SQL_LOG_BIN=0;
51+
2952
DELETE FROM mysql.user ;
3053
CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;
3154
GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;
3255
DROP DATABASE IF EXISTS test ;
56+
FLUSH PRIVILEGES ;
3357
EOSQL
34-
58+
mysql+=( -p"${MYSQL_ROOT_PASSWORD}" )
59+
3560
if [ "$MYSQL_DATABASE" ]; then
36-
echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" >> "$tempSqlFile"
61+
echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"
62+
mysql+=( "$MYSQL_DATABASE" )
3763
fi
38-
64+
3965
if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then
40-
echo "CREATE USER '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD' ;" >> "$tempSqlFile"
41-
66+
echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" | "${mysql[@]}"
67+
4268
if [ "$MYSQL_DATABASE" ]; then
43-
echo "GRANT ALL ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_USER'@'%' ;" >> "$tempSqlFile"
69+
echo "GRANT ALL ON \`"$MYSQL_DATABASE"\`.* TO '"$MYSQL_USER"'@'%' ;" | "${mysql[@]}"
4470
fi
71+
72+
echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}"
4573
fi
46-
47-
echo 'FLUSH PRIVILEGES ;' >> "$tempSqlFile"
48-
49-
set -- "$@" --init-file="$tempSqlFile"
74+
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
83+
done
84+
85+
if ! kill -s TERM "$pid" || ! wait "$pid"; then
86+
echo >&2 'MySQL init process failed.'
87+
exit 1
88+
fi
89+
90+
echo
91+
echo 'MySQL init process done. Ready for start up.'
92+
echo
5093
fi
51-
94+
5295
chown -R mysql:mysql "$DATADIR"
5396
fi
5497

Dockerfile.template

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ FROM debian:%%SUITE%%
44
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
55
RUN groupadd -r mysql && useradd -r -g mysql mysql
66

7+
RUN mkdir /docker-entrypoint-initdb.d
8+
79
RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 199369E5404BD5FC7D2FE43BCBCB082A1BB943DB
810

911
ENV MARIADB_MAJOR %%MARIADB_MAJOR%%
@@ -18,6 +20,8 @@ RUN echo "deb http://ftp.osuosl.org/pub/mariadb/repo/$MARIADB_MAJOR/debian %%SUI
1820
# add repository pinning to make sure dependencies from this MariaDB repo are preferred over Debian dependencies
1921
# libmariadbclient18 : Depends: libmysqlclient18 (= 5.5.42+maria-1~wheezy) but 5.5.43-0+deb7u1 is to be installed
2022

23+
# the "/var/lib/mysql" stuff here is because the mysql-server postinst doesn't have an explicit way to disable the mysql_install_db codepath besides having a database already "configured" (ie, stuff in /var/lib/mysql/mysql)
24+
# also, we set debconf keys to make APT a little quieter
2125
RUN { \
2226
echo mariadb-server-$MARIADB_MAJOR mysql-server/root_password password 'unused'; \
2327
echo mariadb-server-$MARIADB_MAJOR mysql-server/root_password_again password 'unused'; \
@@ -27,8 +31,13 @@ RUN { \
2731
mariadb-server=$MARIADB_VERSION \
2832
&& rm -rf /var/lib/apt/lists/* \
2933
&& rm -rf /var/lib/mysql \
30-
&& mkdir /var/lib/mysql \
31-
&& sed -ri 's/^(bind-address|skip-networking)/;\1/' /etc/mysql/my.cnf
34+
&& mkdir /var/lib/mysql
35+
36+
# comment out a few problematic configuration values
37+
# don't reverse lookup hostnames, they are usually another container
38+
RUN sed -Ei 's/^(bind-address|log)/#&/' /etc/mysql/my.cnf \
39+
&& echo 'skip-host-cache\nskip-name-resolve' | awk '{ print } $1 == "[mysqld]" && c == 0 { c = 1; system("cat") }' /etc/mysql/my.cnf > /tmp/my.cnf \
40+
&& mv /tmp/my.cnf /etc/mysql/my.cnf
3241

3342
VOLUME /var/lib/mysql
3443

0 commit comments

Comments
 (0)