Skip to content
This repository was archived by the owner on Nov 29, 2020. It is now read-only.

Added MySQL 5.7.8-rc-1 and tuned test.sh #83

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions 5.7/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
FROM ubuntu:trusty
MAINTAINER Borja <[email protected]>

ENV DEBIAN_FRONTEND=noninteractive

# Add MySQL configuration
ADD my.cnf /etc/mysql/conf.d/my.cnf
ADD mysqld_charset.cnf /etc/mysql/conf.d/mysqld_charset.cnf

# Add MySQL APT repos
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
RUN apt-key adv --keyserver keys.gnupg.net --recv-keys 8C718D3B5072E1F5
RUN echo "deb http://repo.mysql.com/apt/ubuntu/ trusty mysql-5.7-dmr" \
> /etc/apt/sources.list.d/mysql.list

# Install MySQL
RUN apt-get update && \
apt-get -yq install mysql-server-5.7 pwgen && \
rm -rf /var/lib/apt/lists/* && \
if [ ! -f /usr/share/mysql/my-default.cnf ] ; then cp /etc/mysql/my.cnf /usr/share/mysql/my-default.cnf; fi && \
rm -rf /var/lib/mysql/* && \
mysqld --initialize > /dev/null 2>&1 && \
touch /var/lib/mysql/.EMPTY_DB

# Add MySQL scripts
ADD import_sql.sh /import_sql.sh
ADD run.sh /run.sh

ENV MYSQL_USER=admin \
MYSQL_PASS=**Random** \
ON_CREATE_DB=**False** \
REPLICATION_MASTER=**False** \
REPLICATION_SLAVE=**False** \
REPLICATION_USER=replica \
REPLICATION_PASS=replica

# Add VOLUMEs to allow backup of config and databases
VOLUME ["/etc/mysql", "/var/lib/mysql"]

EXPOSE 3306
CMD ["/run.sh"]
4 changes: 4 additions & 0 deletions 5.7/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
db:
image: tutum/mysql:5.7
environment:
MYSQL_PASS: "**ChangeMe**"
28 changes: 28 additions & 0 deletions 5.7/import_sql.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/bin/bash

if [[ $# -ne 3 ]]; then
echo "Usage: $0 <username> <password> </path/to/sql_file.sql>"
exit 1
fi

echo "=> Starting MySQL Server"
/usr/bin/mysqld_safe > /dev/null 2>&1 &
PID=$!

RET=1
while [[ RET -ne 0 ]]; do
echo "=> Waiting for confirmation of MySQL service startup"
sleep 5
mysql -u"$1" -p"$2" -e "status" > /dev/null 2>&1
RET=$?
done

echo " Started with PID ${PID}"

echo "=> Importing SQL file"
mysql -u"$1" -p"$2" < "$3"

echo "=> Stopping MySQL Server"
mysqladmin -u"$1" -p"$2" shutdown

echo "=> Done!"
6 changes: 6 additions & 0 deletions 5.7/my.cnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[mysqld]
bind-address=0.0.0.0
# http://www.percona.com/blog/2008/05/31/dns-achilles-heel-mysql-installation/
skip_name_resolve
#server-id
#log-bin
7 changes: 7 additions & 0 deletions 5.7/mysqld_charset.cnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[mysqld]
character_set_server=utf8
character_set_filesystem=utf8
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'
init_connect='SET collation_connection = utf8_general_ci'
skip-character-set-client-handshake
190 changes: 190 additions & 0 deletions 5.7/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
#!/bin/bash

set -m
set -e

VOLUME_HOME="/var/lib/mysql"
CONF_FILE="/etc/mysql/conf.d/my.cnf"
LOG="/var/log/mysql/error.log"

# Set permission of config file
chmod 644 ${CONF_FILE}
chmod 644 /etc/mysql/conf.d/mysqld_charset.cnf

StartMySQL ()
{
/usr/bin/mysqld_safe ${EXTRA_OPTS} > /dev/null 2>&1 &
# Time out in 1 minute
LOOP_LIMIT=60
for (( i=0 ; ; i++ )); do
if [ ${i} -eq ${LOOP_LIMIT} ]; then
echo "Time out. Error log is shown as below:"
tail -n 100 ${LOG}
exit 1
fi
echo "=> Waiting for confirmation of MySQL service startup, trying ${i}/${LOOP_LIMIT} ..."
sleep 1
mysql -uroot -e "status" > /dev/null 2>&1 && break
done
}

CreateMySQLUser()
{
if [ "$MYSQL_PASS" = "**Random**" ]; then
unset MYSQL_PASS
fi

PASS=${MYSQL_PASS:-$(pwgen -s 12 1)}
_word=$( [ ${MYSQL_PASS} ] && echo "preset" || echo "random" )
echo "=> Creating MySQL user ${MYSQL_USER} with ${_word} password"

mysql -uroot -e "CREATE USER '${MYSQL_USER}'@'%' IDENTIFIED BY '$PASS'"
mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO '${MYSQL_USER}'@'%' WITH GRANT OPTION"
echo "=> Done!"
echo "========================================================================"
echo "You can now connect to this MySQL Server using:"
echo ""
echo " mysql -u$MYSQL_USER -p$PASS -h<host> -P<port>"
echo ""
echo "Please remember to change the above password as soon as possible!"
echo "MySQL user 'root' has no password but only allows local connections"
echo "========================================================================"
}

OnCreateDB()
{
if [ "$ON_CREATE_DB" = "**False**" ]; then
unset ON_CREATE_DB
else
echo "Creating MySQL database ${ON_CREATE_DB}"
mysql -uroot -e "CREATE DATABASE IF NOT EXISTS ${ON_CREATE_DB};"
echo "Database created!"
fi
}

ImportSql()
{
for FILE in ${STARTUP_SQL}; do
echo "=> Importing SQL file ${FILE}"
if [ "$ON_CREATE_DB" ]; then
mysql -uroot "$ON_CREATE_DB" < "${FILE}"
else
mysql -uroot < "${FILE}"
fi
done
}

# Main
if [ ${REPLICATION_MASTER} == "**False**" ]; then
unset REPLICATION_MASTER
fi

if [ ${REPLICATION_SLAVE} == "**False**" ]; then
unset REPLICATION_SLAVE
fi

# Initialize empty data volume and create MySQL user
if [[ ! -d $VOLUME_HOME/mysql ]]; then
echo "=> An empty or uninitialized MySQL volume is detected in $VOLUME_HOME"
echo "=> Installing MySQL ..."
if [ ! -f /usr/share/mysql/my-default.cnf ] ; then
cp /etc/mysql/my.cnf /usr/share/mysql/my-default.cnf
fi
mysql_install_db || exit 1
touch /var/lib/mysql/.EMPTY_DB
echo "=> Done!"
else
echo "=> Using an existing volume of MySQL"
fi

# Set MySQL REPLICATION - MASTER
if [ -n "${REPLICATION_MASTER}" ]; then
echo "=> Configuring MySQL replication as master (1/2) ..."
if [ ! -f /replication_set.1 ]; then
RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})"
echo "=> Writting configuration file '${CONF_FILE}' with server-id=${RAND}"
sed -i "s/^#server-id.*/server-id = ${RAND}/" ${CONF_FILE}
sed -i "s/^#log-bin.*/log-bin = mysql-bin/" ${CONF_FILE}
touch /replication_set.1
else
echo "=> MySQL replication master already configured, skip"
fi
fi

# Set MySQL REPLICATION - SLAVE
if [ -n "${REPLICATION_SLAVE}" ]; then
echo "=> Configuring MySQL replication as slave (1/2) ..."
if [ -n "${MYSQL_PORT_3306_TCP_ADDR}" ] && [ -n "${MYSQL_PORT_3306_TCP_PORT}" ]; then
if [ ! -f /replication_set.1 ]; then
RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})"
echo "=> Writting configuration file '${CONF_FILE}' with server-id=${RAND}"
sed -i "s/^#server-id.*/server-id = ${RAND}/" ${CONF_FILE}
sed -i "s/^#log-bin.*/log-bin = mysql-bin/" ${CONF_FILE}
touch /replication_set.1
else
echo "=> MySQL replication slave already configured, skip"
fi
else
echo "=> Cannot configure slave, please link it to another MySQL container with alias as 'mysql'"
exit 1
fi
fi


echo "=> Starting MySQL ..."
StartMySQL
tail -F $LOG &

# Create admin user and pre create database
if [ -f /var/lib/mysql/.EMPTY_DB ]; then
echo "=> Creating admin user ..."
CreateMySQLUser
OnCreateDB
rm /var/lib/mysql/.EMPTY_DB
fi


# Import Startup SQL
if [ -n "${STARTUP_SQL}" ]; then
if [ ! -f /sql_imported ]; then
echo "=> Initializing DB with ${STARTUP_SQL}"
ImportSql
touch /sql_imported
fi
fi

# Set MySQL REPLICATION - MASTER
if [ -n "${REPLICATION_MASTER}" ]; then
echo "=> Configuring MySQL replication as master (2/2) ..."
if [ ! -f /replication_set.2 ]; then
echo "=> Creating a log user ${REPLICATION_USER}:${REPLICATION_PASS}"
mysql -uroot -e "CREATE USER '${REPLICATION_USER}'@'%' IDENTIFIED BY '${REPLICATION_PASS}'"
mysql -uroot -e "GRANT REPLICATION SLAVE ON *.* TO '${REPLICATION_USER}'@'%'"
mysql -uroot -e "reset master"
echo "=> Done!"
touch /replication_set.2
else
echo "=> MySQL replication master already configured, skip"
fi
fi

# Set MySQL REPLICATION - SLAVE
if [ -n "${REPLICATION_SLAVE}" ]; then
echo "=> Configuring MySQL replication as slave (2/2) ..."
if [ -n "${MYSQL_PORT_3306_TCP_ADDR}" ] && [ -n "${MYSQL_PORT_3306_TCP_PORT}" ]; then
if [ ! -f /replication_set.2 ]; then
echo "=> Setting master connection info on slave"
mysql -uroot -e "CHANGE MASTER TO MASTER_HOST='${MYSQL_PORT_3306_TCP_ADDR}',MASTER_USER='${MYSQL_ENV_REPLICATION_USER}',MASTER_PASSWORD='${MYSQL_ENV_REPLICATION_PASS}',MASTER_PORT=${MYSQL_PORT_3306_TCP_PORT}, MASTER_CONNECT_RETRY=30"
mysql -uroot -e "start slave"
echo "=> Done!"
touch /replication_set.2
else
echo "=> MySQL replication slave already configured, skip"
fi
else
echo "=> Cannot configure slave, please link it to another MySQL container with alias as 'mysql'"
exit 1
fi
fi

fg
101 changes: 54 additions & 47 deletions test.sh
Original file line number Diff line number Diff line change
@@ -1,51 +1,58 @@
#!/bin/bash
# jue oct 15 13:18:38 CEST 2015
# [email protected]

set -e

echo "=> Building mysql 5.5 image"
docker build -t mysql-5.5 5.5/

echo "=> Testing if mysql is running on 5.5"
docker run -d -p 13306:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" mysql-5.5; sleep 10
mysqladmin -uuser -ptest -h127.0.0.1 -P13306 ping | grep -c "mysqld is alive"

echo "=> Testing replication on mysql 5.5"
docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_MASTER=true -e REPLICATION_USER=repl -e REPLICATION_PASS=repl -p 13307:3306 --name mysql55master mysql-5.5; sleep 10
docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 13308:3306 --link mysql55master:mysql mysql-5.5; sleep 10
docker logs mysql55master | grep "repl:repl"
mysql -uuser -ptest -h127.0.0.1 -P13307 -e "show master status\G;" | grep "mysql-bin.*"
mysql -uuser -ptest -h127.0.0.1 -P13308 -e "show slave status\G;" | grep "Slave_IO_Running.*Yes"
mysql -uuser -ptest -h127.0.0.1 -P13308 -e "show slave status\G;" | grep "Slave_SQL_Running.*Yes"

echo "=> Testing volume on mysql 5.5"
mkdir vol55
docker run --name mysql55.1 -d -p 13309:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" -v $(pwd)/vol55:/var/lib/mysql mysql-5.5; sleep 10
mysqladmin -uuser -ptest -h127.0.0.1 -P13309 ping | grep -c "mysqld is alive"
docker stop mysql55.1
docker run -d -p 13310:3306 -v $(pwd)/vol55:/var/lib/mysql mysql-5.5; sleep 10
mysqladmin -uuser -ptest -h127.0.0.1 -P13310 ping | grep -c "mysqld is alive"

echo "=> Building mysql 5.6 image"
docker build -t mysql-5.6 5.6/

echo "=> Testing if mysql is running on 5.6"
docker run -d -p 23306:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" mysql-5.6; sleep 10
mysqladmin -uuser -ptest -h127.0.0.1 -P13307 ping | grep -c "mysqld is alive"

echo "=> Testing replication on mysql 5.6"
docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_MASTER=true -e REPLICATION_USER=repl -e REPLICATION_PASS=repl -p 23307:3306 --name mysql56master mysql-5.6; sleep 10
docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 23308:3306 --link mysql56master:mysql mysql-5.6; sleep 10
docker logs mysql56master | grep "repl:repl"
mysql -uuser -ptest -h127.0.0.1 -P23307 -e "show master status\G;" | grep "mysql-bin.*"
mysql -uuser -ptest -h127.0.0.1 -P23308 -e "show slave status\G;" | grep "Slave_IO_Running.*Yes"
mysql -uuser -ptest -h127.0.0.1 -P23308 -e "show slave status\G;" | grep "Slave_SQL_Running.*Yes"

echo "=> Testing volume on mysql 5.6"
mkdir vol56
docker run --name mysql56.1 -d -p 23309:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" -v $(pwd)/vol56:/var/lib/mysql mysql-5.6; sleep 10
mysqladmin -uuser -ptest -h127.0.0.1 -P23309 ping | grep -c "mysqld is alive"
docker stop mysql56.1
docker run -d -p 23310:3306 -v $(pwd)/vol56:/var/lib/mysql mysql-5.6; sleep 10
mysqladmin -uuser -ptest -h127.0.0.1 -P23310 ping | grep -c "mysqld is alive"

echo "=>Done"
mysql_docker_test_release()
{
local major="5"
local minor="7"

[[ -z "$major" ]] || major="$1"
[[ -z "$minor" ]] || major="$2"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should be [[ -z "$minor" ]] || minor="$2"

Also, test fails:

=> Testing if mysql is running on 5.7
4c30d70929a39887807650e51bd759b5a69807fea87d8e32bb6738b6e8921837
mysqladmin: connect to server at '127.0.0.1' failed
error: 'Host '172.17.42.1' is not allowed to connect to this MySQL server'
0


local release="${major}.${minor}"

local lport="$(($RANDOM+1024))"
local lport_master="$(($lport+1))"
local lport_slave="$(($lport+2))"
local lport_vol="$(($lport+3))"
local lport_vol2="$(($lport+4))"

echo -e "\e[1m=> Building mysql ${release} image\e[0m"
docker build -t mysql-${release} ${release}/

echo -e "\e[1m=> Testing if mysql is running on ${release}"
docker run -d -p ${lport}:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" mysql-${release}
sleep 10
mysqladmin -uuser -ptest -h127.0.0.1 -P${lport} ping | grep -c "mysqld is alive"

echo -e "\e[1m=> Testing replication on mysql ${release}\e[0m"
docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_MASTER=true \
-e REPLICATION_USER=repl -e REPLICATION_PASS=repl -p ${lport_master}:3306 \
--name mysql${release//.}master mysql-${release}; sleep 10
docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true \
-p ${lport_slave}:3306 --link mysql${release//.}master:mysql mysql-${release}
sleep 10
docker logs mysql${release//.}master | grep "repl:repl"
mysql -uuser -ptest -h127.0.0.1 -P${lport_master} -e "show master status\G;" | grep "mysql-bin.*"
mysql -uuser -ptest -h127.0.0.1 -P${lport_slave} -e "show slave status\G;" | grep "Slave_IO_Running.*Yes"
mysql -uuser -ptest -h127.0.0.1 -P${lport_slave} -e "show slave status\G;" | grep "Slave_SQL_Running.*Yes"

echo -e "\e[1m=> Testing volume on mysql ${release}\e[0m"
mkdir vol${release//.}
docker run --name mysql${release//.}.1 -d -p ${lport_vol}:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" \
-v $(pwd)/vol${release//.}:/var/lib/mysql mysql-${release}
sleep 10
mysqladmin -uuser -ptest -h127.0.0.1 -P${lport_vol} ping | grep -c "mysqld is alive"
docker stop mysql${release//.}.1
docker run -d -p ${lport_vol2}:3306 -v $(pwd)/vol${release//.}:/var/lib/mysql mysql-${release}; sleep 10
mysqladmin -uuser -ptest -h127.0.0.1 -P${lport_vol2} ping | grep -c "mysqld is alive"
}

mysql_docker_test_release 5 5
mysql_docker_test_release 5 6
mysql_docker_test_release 5 7

echo -e "\e[1m DONE \e[0m"