DenMaSeno 9 年之前
父节点
当前提交
ed9bb9fa2f
共有 4 个文件被更改,包括 119 次插入2 次删除
  1. 1 0
      docker-compose.yml
  2. 1 0
      master/Dockerfile
  3. 114 0
      master/entrypoint.sh
  4. 3 2
      slave/entrypoint.sh

+ 1 - 0
docker-compose.yml

@@ -13,6 +13,7 @@ services:
     container_name: mysql-slave
     environment:
       MYSQL_ROOT_PASSWORD: dodol123
+      DOCKER_START_DELAY: 15
     links:
       - mysql-master:mysql-master
     depends_on:

+ 1 - 0
master/Dockerfile

@@ -8,5 +8,6 @@ RUN mkdir -p /var/run/sshd && sed -i "s/UsePrivilegeSeparation.*/UsePrivilegeSep
   touch /root/.Xauthority && \
   true
 
+ADD entrypoint.sh entrypoint.sh
 ADD my.cnf /etc/my.cnf
 ADD init-db.sql /docker-entrypoint-initdb.d/init-db.sql

+ 114 - 0
master/entrypoint.sh

@@ -0,0 +1,114 @@
+#!/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 "$@"
+

+ 3 - 2
slave/entrypoint.sh

@@ -1,8 +1,9 @@
 #!/bin/bash
 set -e
 
-echo WAIT 10 sec
-sleep 10
+if [ ! -z "$DOCKER_START_DELAY" ] ; then
+  sleep $DOCKER_START_DELAY
+fi
 
 # if command starts with an option, prepend mysqld
 if [ "${1:0:1}" = '-' ]; then