# cat test.sh
##############################################
#!/bin/bash
MYSQL_ROOT_PASSWORD="MySQL@123"
mysql=( mysql --protocol=socket -uroot )
echo ${mysql[@]}
mysql+=( -p"${MYSQL_ROOT_PASSWORD}" )
echo ${mysql[@]}
"${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 ;
CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;
GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;
DROP DATABASE IF EXISTS test ;
FLUSH PRIVILEGES ;
EOSQL
################################################
# cat docker-entrypoint.sh
####################################################
#!/bin/sh
set -e
umask 0077
mysql=( mysql --protocol=socket -uroot )
if [ -z "$(ls -A /var/lib/mysql)" ]; then
if [ -z "${MYSQL_ROOT_PASSWORD}" ]; then
mysqld --initialize-insecure --user=mysql
else
mysqld --initialize-insecure --user=mysql
mysqld &
mysqld_pid="$!"
for i in {15..0}; do
if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then
mysql -u root --skip-password -e "alter user root@'localhost' identified by \"${MYSQL_ROOT_PASSWORD}\";"
mysql -u root -p"${MYSQL_ROOT_PASSWORD}" -e "flush privileges;"
break
fi
echo 'MySQL init process in progress...'
sleep 1
done
if [ "$i" = 0 ]; then
echo >&2 'MySQL init process failed.'
exit 1
fi
fi
fi
if ! kill -s TERM "$mysqld_pid" || ! wait "$mysqld_pid"; then
echo >&2 'MySQL init process failed.'
exit 1
fi
exec "$@"
#####################################################
参考
关于cat >file 、cat <file <<EOF、cat <<-EOF的区别
https://www.jianshu.com/p/48dae9d68365
MySQL 5.6官方镜像docker-entrypoint.sh分析
https://www.cnblogs.com/ivictor/p/4832832.html
https://github.com/docker-library/mysql/tree/5836bc9af9deb67b68c32bebad09a0f7513da36e/5.6
https://github.com/mysql/mysql-docker/blob/mysql-server/5.7/docker-entrypoint.sh