├── .gitignore ├── 5.5 ├── Dockerfile ├── custom.cnf └── entrypoint.sh ├── 5.6 ├── Dockerfile ├── custom.cnf └── entrypoint.sh ├── 5.7 ├── Dockerfile ├── custom.cnf ├── entrypoint.sh └── my.cnf ├── LICENSE ├── README.md └── tests ├── 55.sh ├── 56.sh └── 57.sh /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | -------------------------------------------------------------------------------- /5.5/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:trusty 2 | MAINTAINER romeOz 3 | 4 | ENV MYSQL_USER=admin \ 5 | MYSQL_PASS= \ 6 | REPLICATION_USER=replica \ 7 | REPLICATION_PASS=replica \ 8 | REPLICATION_HOST= \ 9 | REPLICATION_PORT=3306 \ 10 | MYSQL_DATA_DIR=/var/lib/mysql \ 11 | MYSQL_CONFIG=/etc/mysql/conf.d/custom.cnf \ 12 | MYSQL_RUN_DIR=/var/run/mysqld \ 13 | MYSQL_LOG=/var/log/mysql/error.log \ 14 | OS_LOCALE="en_US.UTF-8" 15 | 16 | # Set the locale 17 | RUN locale-gen ${OS_LOCALE} 18 | ENV LANG=${OS_LOCALE} \ 19 | LANGUAGE=en_US:en \ 20 | LC_ALL=${OS_LOCALE} 21 | 22 | # Add MySQL configuration 23 | COPY custom.cnf ${MYSQL_CONFIG} 24 | 25 | RUN apt-get update \ 26 | && apt-get -yq install mysql-server-5.5 mysql-client-5.5 lbzip2 \ 27 | && rm -rf /var/lib/apt/lists/* \ 28 | && rm /etc/mysql/conf.d/mysqld_safe_syslog.cnf \ 29 | && touch /tmp/.EMPTY_DB \ 30 | # Forward request and error logs to docker log collector 31 | && ln -sf /dev/stderr ${MYSQL_LOG} 32 | 33 | COPY entrypoint.sh /sbin/entrypoint.sh 34 | RUN chmod 755 /sbin/entrypoint.sh 35 | 36 | EXPOSE 3306/tcp 37 | VOLUME ["${MYSQL_DATA_DIR}", "${MYSQL_RUN_DIR}"] 38 | ENTRYPOINT ["/sbin/entrypoint.sh"] -------------------------------------------------------------------------------- /5.5/custom.cnf: -------------------------------------------------------------------------------- 1 | [mysqld] 2 | bind-address=0.0.0.0 3 | #query_cache_type 4 | # http://www.percona.com/blog/2008/05/31/dns-achilles-heel-mysql-installation/ 5 | skip_name_resolve 6 | #server-id 7 | #log-bin 8 | #relay-log 9 | #slave-skip-errors 10 | 11 | # Configure charset 12 | character_set_server=utf8 13 | character_set_filesystem=utf8 14 | collation-server=utf8_general_ci 15 | init-connect='SET NAMES utf8' 16 | init_connect='SET collation_connection = utf8_general_ci' 17 | skip-character-set-client-handshake 18 | 19 | # Configure logs 20 | log_warnings=1 -------------------------------------------------------------------------------- /5.5/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -m 4 | set -e 5 | 6 | MYSQL_DATA_DIR=${MYSQL_DATA_DIR:-"/var/lib/mysql"} 7 | MYSQL_CONFIG=${MYSQL_CONFIG:-"/etc/mysql/conf.d/custom.cnf"} 8 | MYSQL_LOG=${MYSQL_LOG:-"/var/log/mysql/error.log"} 9 | MYSQL_BACKUP_DIR=${MYSQL_BACKUP_DIR:-"/tmp/backup"} 10 | MYSQL_BACKUP_FILENAME=${MYSQL_BACKUP_FILENAME:-"backup.last.bz2"} 11 | MYSQL_RESTORE=${MYSQL_RESTORE:-} 12 | MYSQL_CHECK=${MYSQL_CHECK:-} 13 | MYSQL_ROTATE_BACKUP=${MYSQL_ROTATE_BACKUP:-true} 14 | MYSQL_CACHE_ENABLED=${MYSQL_CACHE_ENABLED:-false} 15 | 16 | MYSQL_USER=${MYSQL_USER:-admin} 17 | MYSQL_PASS=${MYSQL_PASS:-} 18 | 19 | DB_NAME=${DB_NAME:-} 20 | DB_REMOTE_HOST=${DB_REMOTE_HOST:-} 21 | DB_REMOTE_PORT=${DB_REMOTE_PORT:-3306} 22 | DB_REMOTE_USER=${DB_REMOTE_USER:-admin} 23 | DB_REMOTE_PASS=${DB_REMOTE_PASS:-} 24 | 25 | MYSQL_MODE=${MYSQL_MODE:-} 26 | 27 | REPLICATION_USER=${REPLICATION_USER:-replica} 28 | REPLICATION_PASS=${REPLICATION_PASS:-replica} 29 | REPLICATION_HOST=${REPLICATION_HOST:-} 30 | REPLICATION_PORT=${REPLICATION_PORT:-3306} 31 | 32 | # Set permission of config file 33 | chmod 644 ${MYSQL_CONFIG} 34 | 35 | start_mysql() 36 | { 37 | $(which mysqld_safe) >/dev/null 2>&1 & 38 | 39 | # wait for mysql server to start (max 30 seconds) 40 | timeout=30 41 | echo -n "Waiting for database server to accept connections" 42 | while ! $(which mysqladmin) -u root status >/dev/null 2>&1 43 | do 44 | timeout=$(($timeout - 1)) 45 | if [ $timeout -eq 0 ]; then 46 | echo -e "\nCould not connect to database server. Aborting..." 47 | exit 1 48 | fi 49 | echo -n "." 50 | sleep 1 51 | done 52 | echo 53 | } 54 | 55 | create_mysql_user() 56 | { 57 | if [[ -n ${MYSQL_USER} && -n ${MYSQL_PASS} ]]; then 58 | echo "Creating MySQL user ${MYSQL_USER}..." 59 | mysql -uroot -e "CREATE USER '${MYSQL_USER}'@'%' IDENTIFIED BY '${MYSQL_PASS}'" 60 | mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO '${MYSQL_USER}'@'%' WITH GRANT OPTION" 61 | fi 62 | } 63 | 64 | create_db() 65 | { 66 | if [[ -n ${DB_NAME} ]]; then 67 | for db in $(awk -F',' '{for (i = 1 ; i <= NF ; i++) print $i}' <<< "${DB_NAME}"); do 68 | echo "Creating database \"${db}\"..." 69 | mysql -uroot -e "CREATE DATABASE IF NOT EXISTS ${db};" 70 | done 71 | echo "Done!" 72 | fi 73 | } 74 | 75 | create_backup_dir() 76 | { 77 | if [[ ! -d ${MYSQL_BACKUP_DIR}/ ]]; then 78 | mkdir -p ${MYSQL_BACKUP_DIR}/ 79 | fi 80 | chmod -R 0755 ${MYSQL_BACKUP_DIR} 81 | } 82 | 83 | rotate_backup() 84 | { 85 | echo "Rotate backup..." 86 | 87 | if [[ ${MYSQL_ROTATE_BACKUP} == true ]]; then 88 | WEEK=$(date +"%V") 89 | MONTH=$(date +"%b") 90 | let "INDEX = WEEK % 5" || true 91 | if [[ ${INDEX} == 0 ]]; then 92 | INDEX=4 93 | fi 94 | 95 | test -e ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 && rm ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 96 | mv ${MYSQL_BACKUP_DIR}/backup.bz2 ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 97 | echo "Create backup file: ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2" 98 | 99 | test -e ${MYSQL_BACKUP_DIR}/backup.${MONTH}.bz2 && rm ${MYSQL_BACKUP_DIR}/backup.${MONTH}.bz2 100 | ln ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 ${MYSQL_BACKUP_DIR}/backup.${MONTH}.bz2 101 | echo "Create backup file: ${MYSQL_BACKUP_DIR}/backup.${MONTH}.bz2" 102 | 103 | test -e ${MYSQL_BACKUP_DIR}/backup.last.bz2 && rm ${MYSQL_BACKUP_DIR}/backup.last.bz2 104 | ln ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 ${MYSQL_BACKUP_DIR}/backup.last.bz2 105 | echo "Create backup file: ${MYSQL_BACKUP_DIR}/backup.last.bz2" 106 | else 107 | mv ${MYSQL_BACKUP_DIR}/backup.bz2 ${MYSQL_BACKUP_DIR}/backup.last.bz2 108 | echo "Create backup file: ${MYSQL_BACKUP_DIR}/backup.last.bz2" 109 | fi 110 | } 111 | 112 | import_backup() 113 | { 114 | FILES=$1 115 | if [[ ${FILES} == default ]]; then 116 | FILES="${MYSQL_BACKUP_DIR}/${MYSQL_BACKUP_FILENAME}" 117 | fi 118 | for FILE in ${FILES}; do 119 | echo "Importing dump ${FILE} ..." 120 | if [[ -f "${FILE}" ]]; then 121 | if [[ ${FILE} =~ \.bz2$ ]]; then 122 | lbzip2 -dc -n 2 ${FILE} | mysql -uroot 123 | else 124 | mysql -uroot < "${FILE}" 125 | fi 126 | else 127 | echo "Unknown dump: ${FILE}" 128 | exit 1 129 | fi 130 | done 131 | rm -f ${MYSQL_DATA_DIR}/auto.cnf 132 | } 133 | 134 | # Initialize empty data volume and create MySQL user 135 | if [[ ! -d ${MYSQL_DATA_DIR}/mysql ]]; then 136 | echo "An empty or uninitialized MySQL volume is detected in ${MYSQL_DATA_DIR}" 137 | echo "Installing MySQL..." 138 | mysql_install_db || exit 1 139 | touch /tmp/.EMPTY_DB 140 | echo "Done!" 141 | else 142 | echo "Using an existing volume of MySQL." 143 | fi 144 | 145 | if [[ ${MYSQL_CACHE_ENABLED} == true ]]; then 146 | echo "Enabled query cache to '${MYSQL_CONFIG}' (query_cache_type = 1)" 147 | sed -i "s/^#query_cache_type.*/query_cache_type = 1/" ${MYSQL_CONFIG} 148 | fi 149 | 150 | # Set MySQL REPLICATION - MASTER 151 | if [[ ${MYSQL_MODE} == master ]]; then 152 | echo "Configuring MySQL replication as master (1/2) ..." 153 | if [ ! -f /tmp/.REPLICATION_SET_1 ]; then 154 | RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})" 155 | echo "Writting configuration file '${MYSQL_CONFIG}' with server-id=${RAND}" 156 | sed -i "s/^#server-id.*/server-id = ${RAND}/" ${MYSQL_CONFIG} 157 | sed -i "s/^#log-bin.*/log-bin = ${HOSTNAME}-bin/" ${MYSQL_CONFIG} 158 | touch /tmp/.REPLICATION_SET_1 159 | else 160 | echo "MySQL replication master already configured, skip" 161 | fi 162 | fi 163 | 164 | # Set MySQL REPLICATION - SLAVE 165 | if [[ ${MYSQL_MODE} == slave ]]; then 166 | echo "Configuring MySQL replication as slave (1/2) ..." 167 | if [[ -z ${REPLICATION_HOST} || -z ${REPLICATION_PORT} ]]; then 168 | echo 169 | echo "WARNING: " 170 | echo " Please specify a replication host/port for salve. " 171 | echo 172 | exit 1; 173 | fi 174 | if [ ! -f /tmp/.REPLICATION_SET_1 ]; then 175 | RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})" 176 | echo "Writting configuration file '${MYSQL_CONFIG}' with server-id=${RAND}" 177 | sed -i "s/^#server-id.*/server-id = ${RAND}/" ${MYSQL_CONFIG} 178 | sed -i "s/^#log-bin.*/log-bin = ${HOSTNAME}-bin/" ${MYSQL_CONFIG} 179 | sed -i "s/^#relay-log.*/relay-log = ${HOSTNAME}-relay-bin/" ${MYSQL_CONFIG} 180 | # 1062 - Duplicate entry for INSERT... 181 | #sed -i "s/^#slave-skip-errors.*/slave-skip-errors = 1062/" ${MYSQL_CONFIG} 182 | touch /tmp/.REPLICATION_SET_1 183 | else 184 | echo "MySQL replication slave already configured, skip" 185 | fi 186 | fi 187 | 188 | # allow arguments to be passed to mysqld_safe 189 | if [[ ${1:0:1} = '-' ]]; then 190 | EXTRA_OPTS="$@" 191 | set -- 192 | elif [[ ${1} == mysqld_safe || ${1} == $(which mysqld_safe) ]]; then 193 | EXTRA_OPTS="${@:2}" 194 | set -- 195 | fi 196 | 197 | 198 | # default behaviour is to launch mysqld_safe 199 | if [[ -z ${1} ]]; then 200 | 201 | echo "Starting MySQL..." 202 | start_mysql 203 | 204 | # Export to backup 205 | if [[ ${MYSQL_MODE} == backup ]]; then 206 | if [[ -z ${DB_REMOTE_USER} || -z ${DB_REMOTE_PASS} ]]; then 207 | echo 208 | echo "WARNING: " 209 | echo " Please specify a DB_REMOTE_USER/DB_REMOTE_PASS for backup. " 210 | echo 211 | exit 1; 212 | fi 213 | if [[ -z ${EXTRA_OPTS} ]]; then 214 | EXTRA_OPTS="--compress --opt" 215 | fi 216 | echo "Backup database..." 217 | mysqldump --all-databases --host=${DB_REMOTE_HOST} --port=${DB_REMOTE_PORT} \ 218 | --user=${DB_REMOTE_USER} --password=${DB_REMOTE_PASS} ${EXTRA_OPTS} \ 219 | | lbzip2 -n 2 -9 > ${MYSQL_BACKUP_DIR}/backup.bz2 220 | rotate_backup 221 | exit 0; 222 | fi 223 | 224 | # Check backup 225 | if [[ -n ${MYSQL_CHECK} ]]; then 226 | echo "Check backup..." 227 | if [[ -z ${DB_NAME} ]]; then 228 | echo "Unknown database. DB_NAME does not null" 229 | exit 1; 230 | fi 231 | import_backup "${MYSQL_CHECK}" 232 | if [[ -n $(echo "SELECT schema_name FROM information_schema.schemata WHERE schema_name='${DB_NAME}';" | mysql -uroot | grep -w "${DB_NAME}") ]]; then 233 | echo "Success checking backup" 234 | else 235 | echo "Fail checking backup" 236 | exit 1 237 | fi 238 | exit 0; 239 | fi 240 | 241 | 242 | # Create admin user and pre create database 243 | if [ -f /tmp/.EMPTY_DB ]; then 244 | create_mysql_user 245 | create_db 246 | rm /tmp/.EMPTY_DB 247 | fi 248 | 249 | # Restore form backup 250 | if [[ -n ${MYSQL_RESTORE} && ${MYSQL_MODE} != slave ]]; then 251 | echo "Import dump..." 252 | import_backup "${MYSQL_RESTORE}" 253 | fi 254 | 255 | # Set MySQL REPLICATION - MASTER 256 | if [[ ${MYSQL_MODE} == master ]]; then 257 | echo "Configuring MySQL replication as master (2/2) ..." 258 | if [ ! -f /tmp/.REPLICATION_SET_2 ]; then 259 | if [[ -z ${REPLICATION_USER} || -z ${REPLICATION_PASS} ]]; then 260 | echo 261 | echo "WARNING: " 262 | echo " Please specify a username/password for backup. " 263 | echo 264 | exit 1; 265 | fi 266 | if [[ -n $(echo "SELECT User FROM mysql.user;" | mysql -uroot | grep -w "${REPLICATION_USER}") ]]; then 267 | echo "Remove duplicate log user '${REPLICATION_USER}'..." 268 | mysql -uroot -e "REVOKE ALL PRIVILEGES ON *.* FROM '${REPLICATION_USER}'@'%'" 269 | mysql -uroot -e "DROP USER '${REPLICATION_USER}'@'%'" 270 | fi 271 | echo "Creating a log user '${REPLICATION_USER}:${REPLICATION_PASS}'" 272 | mysql -uroot -e "CREATE USER '${REPLICATION_USER}'@'%' IDENTIFIED BY '${REPLICATION_PASS}'" 273 | mysql -uroot -e "GRANT REPLICATION SLAVE ON *.* TO '${REPLICATION_USER}'@'%'" 274 | mysql -uroot -e "reset master" 275 | echo "Done!" 276 | touch /tmp/.REPLICATION_SET_2 277 | else 278 | echo "MySQL replication master already configured, skip" 279 | fi 280 | fi 281 | 282 | # Set MySQL REPLICATION - SLAVE 283 | if [[ ${MYSQL_MODE} == slave ]]; then 284 | echo "Configuring MySQL replication as slave (2/2) ..." 285 | if [[ -z ${REPLICATION_HOST} || -z ${REPLICATION_PORT} ]]; then 286 | echo 287 | echo "WARNING: " 288 | echo " Please specify a replication host/port for salve. " 289 | echo 290 | exit 1; 291 | fi 292 | 293 | if [ ! -f /tmp/.REPLICATION_SET_2 ]; then 294 | echo "Setting master connection info on slave" 295 | mysql -uroot -e "CHANGE MASTER TO MASTER_HOST='${REPLICATION_HOST}',MASTER_USER='${REPLICATION_USER}',MASTER_PASSWORD='${REPLICATION_PASS}',MASTER_PORT=${REPLICATION_PORT}, MASTER_CONNECT_RETRY=30;" 296 | if [[ -n ${DB_REMOTE_PASS} && -z ${MYSQL_RESTORE} ]]; then 297 | mysqldump --all-databases --master-data --single-transaction --compress \ 298 | --host=${REPLICATION_HOST} --port=${REPLICATION_PORT} \ 299 | --user=${DB_REMOTE_USER} --password=${DB_REMOTE_PASS} | mysql -uroot 300 | rm -f ${MYSQL_DATA_DIR}/auto.cnf 301 | fi 302 | if [[ -n ${MYSQL_RESTORE} ]]; then 303 | echo "Import dump..." 304 | import_backup "${MYSQL_RESTORE}" 305 | fi 306 | mysql -uroot -e "START SLAVE;" 307 | echo "Done!" 308 | touch /tmp/.REPLICATION_SET_2 309 | else 310 | echo "MySQL replication slave already configured, skip" 311 | fi 312 | fi 313 | 314 | $(which mysqladmin) shutdown 315 | exec $(which mysqld_safe) ${EXTRA_OPTS} 316 | else 317 | exec "$@" 318 | fi -------------------------------------------------------------------------------- /5.6/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:trusty 2 | MAINTAINER romeOz 3 | 4 | ENV MYSQL_USER=admin \ 5 | MYSQL_PASS= \ 6 | REPLICATION_USER=replica \ 7 | REPLICATION_PASS=replica \ 8 | REPLICATION_HOST= \ 9 | REPLICATION_PORT=3306 \ 10 | MYSQL_DATA_DIR=/var/lib/mysql \ 11 | MYSQL_CONFIG=/etc/mysql/conf.d/custom.cnf \ 12 | MYSQL_RUN_DIR=/var/run/mysqld \ 13 | MYSQL_LOG=/var/log/mysql/error.log \ 14 | OS_LOCALE="en_US.UTF-8" 15 | 16 | # Set the locale 17 | RUN locale-gen ${OS_LOCALE} 18 | ENV LANG=${OS_LOCALE} \ 19 | LANGUAGE=en_US:en \ 20 | LC_ALL=${OS_LOCALE} 21 | 22 | # Add MySQL configuration 23 | COPY custom.cnf ${MYSQL_CONFIG} 24 | 25 | RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 5072E1F5 \ 26 | && echo "deb http://repo.mysql.com/apt/ubuntu/ trusty mysql-5.6" | sudo tee /etc/apt/sources.list.d/mysql.list \ 27 | && apt-get update \ 28 | && apt-get -yq install mysql-server-5.6 mysql-client-5.6 lbzip2 \ 29 | && rm -rf /var/lib/apt/lists/* \ 30 | && rm -f /etc/mysql/conf.d/mysqld_safe_syslog.cnf \ 31 | && touch /tmp/.EMPTY_DB \ 32 | # Forward request and error logs to docker log collector 33 | && ln -sf /dev/stderr ${MYSQL_LOG} 34 | 35 | COPY entrypoint.sh /sbin/entrypoint.sh 36 | RUN chmod 755 /sbin/entrypoint.sh 37 | 38 | EXPOSE 3306/tcp 39 | VOLUME ["${MYSQL_DATA_DIR}", "${MYSQL_RUN_DIR}"] 40 | ENTRYPOINT ["/sbin/entrypoint.sh"] -------------------------------------------------------------------------------- /5.6/custom.cnf: -------------------------------------------------------------------------------- 1 | [mysqld] 2 | bind-address=0.0.0.0 3 | #query_cache_type 4 | # http://www.percona.com/blog/2008/05/31/dns-achilles-heel-mysql-installation/ 5 | skip_name_resolve 6 | #server-id 7 | #log-bin 8 | #relay-log 9 | #slave-skip-errors 10 | explicit_defaults_for_timestamp = 1 11 | 12 | # Configure charset 13 | character_set_server=utf8 14 | character_set_filesystem=utf8 15 | collation-server=utf8_general_ci 16 | init-connect='SET NAMES utf8' 17 | init_connect='SET collation_connection = utf8_general_ci' 18 | skip-character-set-client-handshake 19 | 20 | # Configure logs 21 | log_warnings=1 22 | -------------------------------------------------------------------------------- /5.6/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -m 4 | set -e 5 | 6 | MYSQL_DATA_DIR=${MYSQL_DATA_DIR:-"/var/lib/mysql"} 7 | MYSQL_CONFIG=${MYSQL_CONFIG:-"/etc/mysql/conf.d/custom.cnf"} 8 | MYSQL_LOG=${MYSQL_LOG:-"/var/log/mysql/error.log"} 9 | MYSQL_BACKUP_DIR=${MYSQL_BACKUP_DIR:-"/tmp/backup"} 10 | MYSQL_BACKUP_FILENAME=${MYSQL_BACKUP_FILENAME:-"backup.last.bz2"} 11 | MYSQL_RESTORE=${MYSQL_RESTORE:-} 12 | MYSQL_CHECK=${MYSQL_CHECK:-} 13 | MYSQL_ROTATE_BACKUP=${MYSQL_ROTATE_BACKUP:-true} 14 | MYSQL_CACHE_ENABLED=${MYSQL_CACHE_ENABLED:-false} 15 | 16 | MYSQL_USER=${MYSQL_USER:-admin} 17 | MYSQL_PASS=${MYSQL_PASS:-} 18 | 19 | DB_NAME=${DB_NAME:-} 20 | DB_REMOTE_HOST=${DB_REMOTE_HOST:-} 21 | DB_REMOTE_PORT=${DB_REMOTE_PORT:-3306} 22 | DB_REMOTE_USER=${DB_REMOTE_USER:-admin} 23 | DB_REMOTE_PASS=${DB_REMOTE_PASS:-} 24 | 25 | MYSQL_MODE=${MYSQL_MODE:-} 26 | 27 | REPLICATION_USER=${REPLICATION_USER:-replica} 28 | REPLICATION_PASS=${REPLICATION_PASS:-replica} 29 | REPLICATION_HOST=${REPLICATION_HOST:-} 30 | REPLICATION_PORT=${REPLICATION_PORT:-3306} 31 | 32 | # Set permission of config file 33 | chmod 644 ${MYSQL_CONFIG} 34 | 35 | start_mysql() 36 | { 37 | $(which mysqld_safe) >/dev/null 2>&1 & 38 | 39 | # wait for mysql server to start (max 30 seconds) 40 | timeout=30 41 | echo -n "Waiting for database server to accept connections" 42 | while ! $(which mysqladmin) -u root status >/dev/null 2>&1 43 | do 44 | timeout=$(($timeout - 1)) 45 | if [ $timeout -eq 0 ]; then 46 | echo -e "\nCould not connect to database server. Aborting..." 47 | exit 1 48 | fi 49 | echo -n "." 50 | sleep 1 51 | done 52 | echo 53 | } 54 | 55 | create_mysql_user() 56 | { 57 | if [[ -n ${MYSQL_USER} && -n ${MYSQL_PASS} ]]; then 58 | echo "Creating MySQL user ${MYSQL_USER}..." 59 | mysql -uroot -e "CREATE USER '${MYSQL_USER}'@'%' IDENTIFIED BY '${MYSQL_PASS}'" 60 | mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO '${MYSQL_USER}'@'%' WITH GRANT OPTION" 61 | fi 62 | } 63 | 64 | create_db() 65 | { 66 | if [[ -n ${DB_NAME} ]]; then 67 | for db in $(awk -F',' '{for (i = 1 ; i <= NF ; i++) print $i}' <<< "${DB_NAME}"); do 68 | echo "Creating database \"${db}\"..." 69 | mysql -uroot -e "CREATE DATABASE IF NOT EXISTS ${db};" 70 | done 71 | echo "Done!" 72 | fi 73 | } 74 | 75 | create_backup_dir() 76 | { 77 | if [[ ! -d ${MYSQL_BACKUP_DIR}/ ]]; then 78 | mkdir -p ${MYSQL_BACKUP_DIR}/ 79 | fi 80 | chmod -R 0755 ${MYSQL_BACKUP_DIR} 81 | } 82 | 83 | rotate_backup() 84 | { 85 | echo "Rotate backup..." 86 | 87 | if [[ ${MYSQL_ROTATE_BACKUP} == true ]]; then 88 | WEEK=$(date +"%V") 89 | MONTH=$(date +"%b") 90 | let "INDEX = WEEK % 5" || true 91 | if [[ ${INDEX} == 0 ]]; then 92 | INDEX=4 93 | fi 94 | 95 | test -e ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 && rm ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 96 | mv ${MYSQL_BACKUP_DIR}/backup.bz2 ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 97 | echo "Create backup file: ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2" 98 | 99 | test -e ${MYSQL_BACKUP_DIR}/backup.${MONTH}.bz2 && rm ${MYSQL_BACKUP_DIR}/backup.${MONTH}.bz2 100 | ln ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 ${MYSQL_BACKUP_DIR}/backup.${MONTH}.bz2 101 | echo "Create backup file: ${MYSQL_BACKUP_DIR}/backup.${MONTH}.bz2" 102 | 103 | test -e ${MYSQL_BACKUP_DIR}/backup.last.bz2 && rm ${MYSQL_BACKUP_DIR}/backup.last.bz2 104 | ln ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 ${MYSQL_BACKUP_DIR}/backup.last.bz2 105 | echo "Create backup file: ${MYSQL_BACKUP_DIR}/backup.last.bz2" 106 | else 107 | mv ${MYSQL_BACKUP_DIR}/backup.bz2 ${MYSQL_BACKUP_DIR}/backup.last.bz2 108 | echo "Create backup file: ${MYSQL_BACKUP_DIR}/backup.last.bz2" 109 | fi 110 | } 111 | 112 | import_backup() 113 | { 114 | FILES=$1 115 | if [[ ${FILES} == default ]]; then 116 | FILES="${MYSQL_BACKUP_DIR}/${MYSQL_BACKUP_FILENAME}" 117 | fi 118 | for FILE in ${FILES}; do 119 | echo "Importing dump ${FILE} ..." 120 | if [[ -f "${FILE}" ]]; then 121 | if [[ ${FILE} =~ \.bz2$ ]]; then 122 | lbzip2 -dc -n 2 ${FILE} | mysql -uroot 123 | else 124 | mysql -uroot < "${FILE}" 125 | fi 126 | else 127 | echo "Unknown dump: ${FILE}" 128 | exit 1 129 | fi 130 | done 131 | rm -f ${MYSQL_DATA_DIR}/auto.cnf 132 | } 133 | 134 | # Initialize empty data volume and create MySQL user 135 | if [[ ! -d ${MYSQL_DATA_DIR}/mysql ]]; then 136 | echo "An empty or uninitialized MySQL volume is detected in ${MYSQL_DATA_DIR}" 137 | echo "Installing MySQL..." 138 | mysql_install_db || exit 1 139 | touch /tmp/.EMPTY_DB 140 | echo "Done!" 141 | else 142 | echo "Using an existing volume of MySQL." 143 | fi 144 | 145 | if [[ ${MYSQL_CACHE_ENABLED} == true ]]; then 146 | echo "Enabled query cache to '${MYSQL_CONFIG}' (query_cache_type = 1)" 147 | sed -i "s/^#query_cache_type.*/query_cache_type = 1/" ${MYSQL_CONFIG} 148 | fi 149 | 150 | # Set MySQL REPLICATION - MASTER 151 | if [[ ${MYSQL_MODE} == master ]]; then 152 | echo "Configuring MySQL replication as master (1/2) ..." 153 | if [ ! -f /tmp/.REPLICATION_SET_1 ]; then 154 | RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})" 155 | echo "Writting configuration file '${MYSQL_CONFIG}' with server-id=${RAND}" 156 | sed -i "s/^#server-id.*/server-id = ${RAND}/" ${MYSQL_CONFIG} 157 | sed -i "s/^#log-bin.*/log-bin = ${HOSTNAME}-bin/" ${MYSQL_CONFIG} 158 | touch /tmp/.REPLICATION_SET_1 159 | else 160 | echo "MySQL replication master already configured, skip" 161 | fi 162 | fi 163 | 164 | # Set MySQL REPLICATION - SLAVE 165 | if [[ ${MYSQL_MODE} == slave ]]; then 166 | echo "Configuring MySQL replication as slave (1/2) ..." 167 | if [[ -z ${REPLICATION_HOST} || -z ${REPLICATION_PORT} ]]; then 168 | echo 169 | echo "WARNING: " 170 | echo " Please specify a replication host/port for salve. " 171 | echo 172 | exit 1; 173 | fi 174 | if [ ! -f /tmp/.REPLICATION_SET_1 ]; then 175 | RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})" 176 | echo "Writting configuration file '${MYSQL_CONFIG}' with server-id=${RAND}" 177 | sed -i "s/^#server-id.*/server-id = ${RAND}/" ${MYSQL_CONFIG} 178 | sed -i "s/^#log-bin.*/log-bin = ${HOSTNAME}-bin/" ${MYSQL_CONFIG} 179 | sed -i "s/^#relay-log.*/relay-log = ${HOSTNAME}-relay-bin/" ${MYSQL_CONFIG} 180 | # 1062 - Duplicate entry for INSERT... 181 | #sed -i "s/^#slave-skip-errors.*/slave-skip-errors = 1062/" ${MYSQL_CONFIG} 182 | touch /tmp/.REPLICATION_SET_1 183 | else 184 | echo "MySQL replication slave already configured, skip" 185 | fi 186 | fi 187 | 188 | # allow arguments to be passed to mysqld_safe 189 | if [[ ${1:0:1} = '-' ]]; then 190 | EXTRA_OPTS="$@" 191 | set -- 192 | elif [[ ${1} == mysqld_safe || ${1} == $(which mysqld_safe) ]]; then 193 | EXTRA_OPTS="${@:2}" 194 | set -- 195 | fi 196 | 197 | 198 | # default behaviour is to launch mysqld_safe 199 | if [[ -z ${1} ]]; then 200 | 201 | echo "Starting MySQL..." 202 | start_mysql 203 | 204 | # Export to backup 205 | if [[ ${MYSQL_MODE} == backup ]]; then 206 | if [[ -z ${DB_REMOTE_USER} || -z ${DB_REMOTE_PASS} ]]; then 207 | echo 208 | echo "WARNING: " 209 | echo " Please specify a DB_REMOTE_USER/DB_REMOTE_PASS for backup. " 210 | echo 211 | exit 1; 212 | fi 213 | if [[ -z ${EXTRA_OPTS} ]]; then 214 | EXTRA_OPTS="--compress --opt" 215 | fi 216 | echo "Backup database..." 217 | mysqldump --all-databases --host=${DB_REMOTE_HOST} --port=${DB_REMOTE_PORT} \ 218 | --user=${DB_REMOTE_USER} --password=${DB_REMOTE_PASS} ${EXTRA_OPTS} \ 219 | | lbzip2 -n 2 -9 > ${MYSQL_BACKUP_DIR}/backup.bz2 220 | rotate_backup 221 | exit 0; 222 | fi 223 | 224 | # Check backup 225 | if [[ -n ${MYSQL_CHECK} ]]; then 226 | echo "Check backup..." 227 | if [[ -z ${DB_NAME} ]]; then 228 | echo "Unknown database. DB_NAME does not null" 229 | exit 1; 230 | fi 231 | import_backup "${MYSQL_CHECK}" 232 | if [[ -n $(echo "SELECT schema_name FROM information_schema.schemata WHERE schema_name='${DB_NAME}';" | mysql -uroot | grep -w "${DB_NAME}") ]]; then 233 | echo "Success checking backup" 234 | else 235 | echo "Fail checking backup" 236 | exit 1 237 | fi 238 | exit 0; 239 | fi 240 | 241 | 242 | # Create admin user and pre create database 243 | if [ -f /tmp/.EMPTY_DB ]; then 244 | create_mysql_user 245 | create_db 246 | rm /tmp/.EMPTY_DB 247 | fi 248 | 249 | # Restore form backup 250 | if [[ -n ${MYSQL_RESTORE} && ${MYSQL_MODE} != slave ]]; then 251 | echo "Import dump..." 252 | import_backup "${MYSQL_RESTORE}" 253 | fi 254 | 255 | # Set MySQL REPLICATION - MASTER 256 | if [[ ${MYSQL_MODE} == master ]]; then 257 | echo "Configuring MySQL replication as master (2/2) ..." 258 | if [ ! -f /tmp/.REPLICATION_SET_2 ]; then 259 | if [[ -z ${REPLICATION_USER} || -z ${REPLICATION_PASS} ]]; then 260 | echo 261 | echo "WARNING: " 262 | echo " Please specify a username/password for backup. " 263 | echo 264 | exit 1; 265 | fi 266 | if [[ -n $(echo "SELECT User FROM mysql.user;" | mysql -uroot | grep -w "${REPLICATION_USER}") ]]; then 267 | echo "Remove duplicate log user '${REPLICATION_USER}'..." 268 | mysql -uroot -e "REVOKE ALL PRIVILEGES ON *.* FROM '${REPLICATION_USER}'@'%'" 269 | mysql -uroot -e "DROP USER '${REPLICATION_USER}'@'%'" 270 | fi 271 | echo "Creating a log user '${REPLICATION_USER}:${REPLICATION_PASS}'" 272 | mysql -uroot -e "CREATE USER '${REPLICATION_USER}'@'%' IDENTIFIED BY '${REPLICATION_PASS}'" 273 | mysql -uroot -e "GRANT REPLICATION SLAVE ON *.* TO '${REPLICATION_USER}'@'%'" 274 | mysql -uroot -e "reset master" 275 | echo "Done!" 276 | touch /tmp/.REPLICATION_SET_2 277 | else 278 | echo "MySQL replication master already configured, skip" 279 | fi 280 | fi 281 | 282 | # Set MySQL REPLICATION - SLAVE 283 | if [[ ${MYSQL_MODE} == slave ]]; then 284 | echo "Configuring MySQL replication as slave (2/2) ..." 285 | if [[ -z ${REPLICATION_HOST} || -z ${REPLICATION_PORT} ]]; then 286 | echo 287 | echo "WARNING: " 288 | echo " Please specify a replication host/port for salve. " 289 | echo 290 | exit 1; 291 | fi 292 | 293 | if [ ! -f /tmp/.REPLICATION_SET_2 ]; then 294 | echo "Setting master connection info on slave" 295 | mysql -uroot -e "CHANGE MASTER TO MASTER_HOST='${REPLICATION_HOST}',MASTER_USER='${REPLICATION_USER}',MASTER_PASSWORD='${REPLICATION_PASS}',MASTER_PORT=${REPLICATION_PORT}, MASTER_CONNECT_RETRY=30;" 296 | if [[ -n ${DB_REMOTE_PASS} && -z ${MYSQL_RESTORE} ]]; then 297 | mysqldump --all-databases --master-data --single-transaction --compress \ 298 | --host=${REPLICATION_HOST} --port=${REPLICATION_PORT} \ 299 | --user=${DB_REMOTE_USER} --password=${DB_REMOTE_PASS} | mysql -uroot 300 | rm -f ${MYSQL_DATA_DIR}/auto.cnf 301 | fi 302 | if [[ -n ${MYSQL_RESTORE} ]]; then 303 | echo "Import dump..." 304 | import_backup "${MYSQL_RESTORE}" 305 | fi 306 | mysql -uroot -e "START SLAVE;" 307 | echo "Done!" 308 | touch /tmp/.REPLICATION_SET_2 309 | else 310 | echo "MySQL replication slave already configured, skip" 311 | fi 312 | fi 313 | 314 | $(which mysqladmin) shutdown 315 | exec $(which mysqld_safe) ${EXTRA_OPTS} 316 | else 317 | exec "$@" 318 | fi -------------------------------------------------------------------------------- /5.7/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:xenial 2 | MAINTAINER romeOz 3 | 4 | ENV MYSQL_USER=admin \ 5 | MYSQL_PASS= \ 6 | REPLICATION_USER=replica \ 7 | REPLICATION_PASS=replica \ 8 | REPLICATION_HOST= \ 9 | REPLICATION_PORT=3306 \ 10 | MYSQL_DATA_DIR=/var/lib/mysql \ 11 | MYSQL_CONFIG=/etc/mysql/conf.d/custom.cnf \ 12 | MYSQL_RUN_DIR=/var/run/mysqld \ 13 | MYSQL_LOG=/var/log/mysql/error.log \ 14 | OS_LOCALE="en_US.UTF-8" 15 | 16 | # Set the locale 17 | RUN locale-gen ${OS_LOCALE} 18 | ENV LANG=${OS_LOCALE} \ 19 | LANGUAGE=en_US:en \ 20 | LC_ALL=${OS_LOCALE} 21 | 22 | RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 5072E1F5 \ 23 | && echo "deb http://repo.mysql.com/apt/ubuntu/ xenial mysql-5.7" | tee /etc/apt/sources.list.d/mysql.list \ 24 | && apt-get update \ 25 | && apt-get -yq install mysql-server mysql-client lbzip2 \ 26 | && rm -rf /etc/mysql/* \ 27 | && mkdir /etc/mysql/conf.d \ 28 | && rm -rf /var/lib/apt/lists/* \ 29 | && touch /tmp/.EMPTY_DB \ 30 | # Forward request and error logs to docker log collector 31 | && ln -sf /dev/stderr ${MYSQL_LOG} 32 | 33 | # Add MySQL configuration 34 | COPY my.cnf /etc/mysql/my.cnf 35 | COPY custom.cnf ${MYSQL_CONFIG} 36 | 37 | COPY entrypoint.sh /sbin/entrypoint.sh 38 | RUN chmod 755 /sbin/entrypoint.sh 39 | 40 | EXPOSE 3306/tcp 41 | VOLUME ["${MYSQL_DATA_DIR}", "${MYSQL_RUN_DIR}"] 42 | ENTRYPOINT ["/sbin/entrypoint.sh"] -------------------------------------------------------------------------------- /5.7/custom.cnf: -------------------------------------------------------------------------------- 1 | [mysqld] 2 | bind-address=0.0.0.0 3 | #query_cache_type 4 | # http://www.percona.com/blog/2008/05/31/dns-achilles-heel-mysql-installation/ 5 | skip_name_resolve 6 | #server-id 7 | #log-bin 8 | #relay-log 9 | #slave-skip-errors 10 | 11 | # Configure charset 12 | character_set_server=utf8 13 | character_set_filesystem=utf8 14 | collation-server=utf8_general_ci 15 | init-connect='SET NAMES utf8' 16 | init_connect='SET collation_connection = utf8_general_ci' 17 | skip-character-set-client-handshake 18 | 19 | # Configure logs 20 | log_error_verbosity=2 21 | -------------------------------------------------------------------------------- /5.7/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -m 4 | set -e 5 | 6 | MYSQL_DATA_DIR=${MYSQL_DATA_DIR:-"/var/lib/mysql"} 7 | MYSQL_CONFIG=${MYSQL_CONFIG:-"/etc/mysql/conf.d/custom.cnf"} 8 | MYSQL_LOG=${MYSQL_LOG:-"/var/log/mysql/error.log"} 9 | MYSQL_BACKUP_DIR=${MYSQL_BACKUP_DIR:-"/tmp/backup"} 10 | MYSQL_BACKUP_FILENAME=${MYSQL_BACKUP_FILENAME:-"backup.last.bz2"} 11 | MYSQL_RESTORE=${MYSQL_RESTORE:-} 12 | MYSQL_CHECK=${MYSQL_CHECK:-} 13 | MYSQL_ROTATE_BACKUP=${MYSQL_ROTATE_BACKUP:-true} 14 | MYSQL_CACHE_ENABLED=${MYSQL_CACHE_ENABLED:-false} 15 | 16 | MYSQL_USER=${MYSQL_USER:-admin} 17 | MYSQL_PASS=${MYSQL_PASS:-} 18 | 19 | DB_NAME=${DB_NAME:-} 20 | DB_REMOTE_HOST=${DB_REMOTE_HOST:-} 21 | DB_REMOTE_PORT=${DB_REMOTE_PORT:-3306} 22 | DB_REMOTE_USER=${DB_REMOTE_USER:-admin} 23 | DB_REMOTE_PASS=${DB_REMOTE_PASS:-} 24 | 25 | MYSQL_MODE=${MYSQL_MODE:-} 26 | 27 | REPLICATION_USER=${REPLICATION_USER:-replica} 28 | REPLICATION_PASS=${REPLICATION_PASS:-replica} 29 | REPLICATION_HOST=${REPLICATION_HOST:-} 30 | REPLICATION_PORT=${REPLICATION_PORT:-3306} 31 | 32 | # Set permission of config file 33 | chmod 644 ${MYSQL_CONFIG} 34 | 35 | start_mysql() 36 | { 37 | $(which mysqld) >/dev/null 2>&1 & 38 | 39 | # wait for mysql server to start (max 30 seconds) 40 | timeout=30 41 | echo -n "Waiting for database server to accept connections" 42 | while ! /usr/bin/mysqladmin -u root status >/dev/null 2>&1 43 | do 44 | timeout=$(($timeout - 1)) 45 | if [ $timeout -eq 0 ]; then 46 | echo -e "\nCould not connect to database server. Aborting..." 47 | exit 1 48 | fi 49 | echo -n "." 50 | sleep 1 51 | done 52 | echo 53 | } 54 | 55 | create_mysql_user() 56 | { 57 | if [[ -n ${MYSQL_USER} && -n ${MYSQL_PASS} ]]; then 58 | echo "Creating MySQL user ${MYSQL_USER}..." 59 | mysql -uroot -e "CREATE USER '${MYSQL_USER}'@'%' IDENTIFIED BY '${MYSQL_PASS}'" 60 | mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO '${MYSQL_USER}'@'%' WITH GRANT OPTION" 61 | fi 62 | } 63 | 64 | create_db() 65 | { 66 | if [[ -n ${DB_NAME} ]]; then 67 | for db in $(awk -F',' '{for (i = 1 ; i <= NF ; i++) print $i}' <<< "${DB_NAME}"); do 68 | echo "Creating database \"${db}\"..." 69 | mysql -uroot -e "CREATE DATABASE IF NOT EXISTS ${db};" 70 | done 71 | echo "Done!" 72 | fi 73 | } 74 | 75 | create_backup_dir() 76 | { 77 | if [[ ! -d ${MYSQL_BACKUP_DIR}/ ]]; then 78 | mkdir -p ${MYSQL_BACKUP_DIR}/ 79 | fi 80 | chmod -R 0755 ${MYSQL_BACKUP_DIR} 81 | } 82 | 83 | rotate_backup() 84 | { 85 | echo "Rotate backup..." 86 | 87 | if [[ ${MYSQL_ROTATE_BACKUP} == true ]]; then 88 | WEEK=$(date +"%V") 89 | MONTH=$(date +"%b") 90 | let "INDEX = WEEK % 5" || true 91 | if [[ ${INDEX} == 0 ]]; then 92 | INDEX=4 93 | fi 94 | 95 | test -e ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 && rm ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 96 | mv ${MYSQL_BACKUP_DIR}/backup.bz2 ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 97 | echo "Create backup file: ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2" 98 | 99 | test -e ${MYSQL_BACKUP_DIR}/backup.${MONTH}.bz2 && rm ${MYSQL_BACKUP_DIR}/backup.${MONTH}.bz2 100 | ln ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 ${MYSQL_BACKUP_DIR}/backup.${MONTH}.bz2 101 | echo "Create backup file: ${MYSQL_BACKUP_DIR}/backup.${MONTH}.bz2" 102 | 103 | test -e ${MYSQL_BACKUP_DIR}/backup.last.bz2 && rm ${MYSQL_BACKUP_DIR}/backup.last.bz2 104 | ln ${MYSQL_BACKUP_DIR}/backup.${INDEX}.bz2 ${MYSQL_BACKUP_DIR}/backup.last.bz2 105 | echo "Create backup file: ${MYSQL_BACKUP_DIR}/backup.last.bz2" 106 | else 107 | mv ${MYSQL_BACKUP_DIR}/backup.bz2 ${MYSQL_BACKUP_DIR}/backup.last.bz2 108 | echo "Create backup file: ${MYSQL_BACKUP_DIR}/backup.last.bz2" 109 | fi 110 | } 111 | 112 | import_backup() 113 | { 114 | FILES=$1 115 | if [[ ${FILES} == default ]]; then 116 | FILES="${MYSQL_BACKUP_DIR}/${MYSQL_BACKUP_FILENAME}" 117 | fi 118 | for FILE in ${FILES}; do 119 | echo "Importing dump ${FILE} ..." 120 | if [[ -f "${FILE}" ]]; then 121 | if [[ ${FILE} =~ \.bz2$ ]]; then 122 | lbzip2 -dc -n 2 ${FILE} | mysql -uroot 123 | else 124 | mysql -uroot < "${FILE}" 125 | fi 126 | else 127 | echo "Unknown dump: ${FILE}" 128 | exit 1 129 | fi 130 | done 131 | rm -f ${MYSQL_DATA_DIR}/auto.cnf 132 | } 133 | 134 | # Initialize empty data volume and create MySQL user 135 | if [[ ! -d ${MYSQL_DATA_DIR}/mysql ]]; then 136 | echo "An empty or uninitialized MySQL volume is detected in ${MYSQL_DATA_DIR}" 137 | echo "Installing MySQL..." 138 | mysql_install_db || exit 1 139 | touch /tmp/.EMPTY_DB 140 | echo "Done!" 141 | else 142 | echo "Using an existing volume of MySQL." 143 | fi 144 | 145 | if [[ ${MYSQL_CACHE_ENABLED} == true ]]; then 146 | echo "Enabled query cache to '${MYSQL_CONFIG}' (query_cache_type = 1)" 147 | sed -i "s/^#query_cache_type.*/query_cache_type = 1/" ${MYSQL_CONFIG} 148 | fi 149 | 150 | # Set MySQL REPLICATION - MASTER 151 | if [[ ${MYSQL_MODE} == master ]]; then 152 | echo "Configuring MySQL replication as master (1/2) ..." 153 | if [ ! -f /tmp/.REPLICATION_SET_1 ]; then 154 | RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})" 155 | echo "Writting configuration file '${MYSQL_CONFIG}' with server-id=${RAND}" 156 | sed -i "s/^#server-id.*/server-id = ${RAND}/" ${MYSQL_CONFIG} 157 | sed -i "s/^#log-bin.*/log-bin = ${HOSTNAME}-bin/" ${MYSQL_CONFIG} 158 | touch /tmp/.REPLICATION_SET_1 159 | else 160 | echo "MySQL replication master already configured, skip" 161 | fi 162 | fi 163 | 164 | # Set MySQL REPLICATION - SLAVE 165 | if [[ ${MYSQL_MODE} == slave ]]; then 166 | echo "Configuring MySQL replication as slave (1/2) ..." 167 | if [[ -z ${REPLICATION_HOST} || -z ${REPLICATION_PORT} ]]; then 168 | echo 169 | echo "WARNING: " 170 | echo " Please specify a replication host/port for salve. " 171 | echo 172 | exit 1; 173 | fi 174 | if [ ! -f /tmp/.REPLICATION_SET_1 ]; then 175 | RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})" 176 | echo "Writting configuration file '${MYSQL_CONFIG}' with server-id=${RAND}" 177 | sed -i "s/^#server-id.*/server-id = ${RAND}/" ${MYSQL_CONFIG} 178 | sed -i "s/^#log-bin.*/log-bin = ${HOSTNAME}-bin/" ${MYSQL_CONFIG} 179 | sed -i "s/^#relay-log.*/relay-log = ${HOSTNAME}-relay-bin/" ${MYSQL_CONFIG} 180 | # 1062 - Duplicate entry for INSERT... 181 | #sed -i "s/^#slave-skip-errors.*/slave-skip-errors = 1062/" ${MYSQL_CONFIG} 182 | touch /tmp/.REPLICATION_SET_1 183 | else 184 | echo "MySQL replication slave already configured, skip" 185 | fi 186 | fi 187 | 188 | # allow arguments to be passed to mysqld_safe 189 | if [[ ${1:0:1} = '-' ]]; then 190 | EXTRA_OPTS="$@" 191 | set -- 192 | elif [[ ${1} == mysqld_safe || ${1} == $(which mysqld_safe) ]]; then 193 | EXTRA_OPTS="${@:2}" 194 | set -- 195 | fi 196 | 197 | 198 | # default behaviour is to launch mysqld_safe 199 | if [[ -z ${1} ]]; then 200 | 201 | echo "Starting MySQL..." 202 | start_mysql 203 | 204 | # Export to backup 205 | if [[ ${MYSQL_MODE} == backup ]]; then 206 | if [[ -z ${DB_REMOTE_USER} || -z ${DB_REMOTE_PASS} ]]; then 207 | echo 208 | echo "WARNING: " 209 | echo " Please specify a DB_REMOTE_USER/DB_REMOTE_PASS for backup. " 210 | echo 211 | exit 1; 212 | fi 213 | if [[ -z ${EXTRA_OPTS} ]]; then 214 | EXTRA_OPTS="--compress --opt" 215 | fi 216 | echo "Backup database..." 217 | mysqldump --all-databases --host=${DB_REMOTE_HOST} --port=${DB_REMOTE_PORT} \ 218 | --user=${DB_REMOTE_USER} --password=${DB_REMOTE_PASS} ${EXTRA_OPTS} \ 219 | | lbzip2 -n 2 -9 > ${MYSQL_BACKUP_DIR}/backup.bz2 220 | rotate_backup 221 | exit 0; 222 | fi 223 | 224 | # Check backup 225 | if [[ -n ${MYSQL_CHECK} ]]; then 226 | echo "Check backup..." 227 | if [[ -z ${DB_NAME} ]]; then 228 | echo "Unknown database. DB_NAME does not null" 229 | exit 1; 230 | fi 231 | import_backup "${MYSQL_CHECK}" 232 | if [[ -n $(echo "SELECT schema_name FROM information_schema.schemata WHERE schema_name='${DB_NAME}';" | mysql -uroot | grep -w "${DB_NAME}") ]]; then 233 | echo "Success checking backup" 234 | else 235 | echo "Fail checking backup" 236 | exit 1 237 | fi 238 | exit 0; 239 | fi 240 | 241 | 242 | # Create admin user and pre create database 243 | if [ -f /tmp/.EMPTY_DB ]; then 244 | create_mysql_user 245 | create_db 246 | rm /tmp/.EMPTY_DB 247 | fi 248 | 249 | # Restore form backup 250 | if [[ -n ${MYSQL_RESTORE} && ${MYSQL_MODE} != slave ]]; then 251 | echo "Import dump..." 252 | import_backup "${MYSQL_RESTORE}" 253 | fi 254 | 255 | # Set MySQL REPLICATION - MASTER 256 | if [[ ${MYSQL_MODE} == master ]]; then 257 | echo "Configuring MySQL replication as master (2/2) ..." 258 | if [ ! -f /tmp/.REPLICATION_SET_2 ]; then 259 | if [[ -z ${REPLICATION_USER} || -z ${REPLICATION_PASS} ]]; then 260 | echo 261 | echo "WARNING: " 262 | echo " Please specify a username/password for backup. " 263 | echo 264 | exit 1; 265 | fi 266 | if [[ -n $(echo "SELECT User FROM mysql.user;" | mysql -uroot | grep -w "${REPLICATION_USER}") ]]; then 267 | echo "Remove duplicate log user '${REPLICATION_USER}'..." 268 | mysql -uroot -e "REVOKE ALL PRIVILEGES ON *.* FROM '${REPLICATION_USER}'@'%'" 269 | mysql -uroot -e "DROP USER '${REPLICATION_USER}'@'%'" 270 | fi 271 | echo "Creating a log user '${REPLICATION_USER}:${REPLICATION_PASS}'" 272 | mysql -uroot -e "CREATE USER '${REPLICATION_USER}'@'%' IDENTIFIED BY '${REPLICATION_PASS}'" 273 | mysql -uroot -e "GRANT REPLICATION SLAVE ON *.* TO '${REPLICATION_USER}'@'%'" 274 | mysql -uroot -e "reset master" 275 | echo "Done!" 276 | touch /tmp/.REPLICATION_SET_2 277 | else 278 | echo "MySQL replication master already configured, skip" 279 | fi 280 | fi 281 | 282 | # Set MySQL REPLICATION - SLAVE 283 | if [[ ${MYSQL_MODE} == slave ]]; then 284 | echo "Configuring MySQL replication as slave (2/2) ..." 285 | if [[ -z ${REPLICATION_HOST} || -z ${REPLICATION_PORT} ]]; then 286 | echo 287 | echo "WARNING: " 288 | echo " Please specify a replication host/port for salve. " 289 | echo 290 | exit 1; 291 | fi 292 | 293 | if [ ! -f /tmp/.REPLICATION_SET_2 ]; then 294 | echo "Setting master connection info on slave" 295 | mysql -uroot -e "CHANGE MASTER TO MASTER_HOST='${REPLICATION_HOST}',MASTER_USER='${REPLICATION_USER}',MASTER_PASSWORD='${REPLICATION_PASS}',MASTER_PORT=${REPLICATION_PORT}, MASTER_CONNECT_RETRY=30;" 296 | if [[ -n ${DB_REMOTE_PASS} && -z ${MYSQL_RESTORE} ]]; then 297 | mysqldump --all-databases --master-data --single-transaction --compress \ 298 | --host=${REPLICATION_HOST} --port=${REPLICATION_PORT} \ 299 | --user=${DB_REMOTE_USER} --password=${DB_REMOTE_PASS} | mysql -uroot 300 | rm -f ${MYSQL_DATA_DIR}/auto.cnf 301 | fi 302 | if [[ -n ${MYSQL_RESTORE} ]]; then 303 | echo "Import dump..." 304 | import_backup "${MYSQL_RESTORE}" 305 | fi 306 | mysql -e "START SLAVE;" 307 | echo "Done!" 308 | touch /tmp/.REPLICATION_SET_2 309 | else 310 | echo "MySQL replication slave already configured, skip" 311 | fi 312 | fi 313 | 314 | /usr/bin/mysqladmin shutdown 315 | exec $(which mysqld_safe) ${EXTRA_OPTS} 316 | else 317 | exec "$@" 318 | fi -------------------------------------------------------------------------------- /5.7/my.cnf: -------------------------------------------------------------------------------- 1 | [client] 2 | port = 3306 3 | socket = /var/run/mysqld/mysqld.sock 4 | 5 | [mysqld_safe] 6 | pid-file = /var/run/mysqld/mysqld.pid 7 | socket = /var/run/mysqld/mysqld.sock 8 | nice = 0 9 | 10 | [mysqld] 11 | user = mysql 12 | pid-file = /var/run/mysqld/mysqld.pid 13 | socket = /var/run/mysqld/mysqld.sock 14 | port = 3306 15 | basedir = /usr 16 | datadir = /var/lib/mysql 17 | tmpdir = /tmp 18 | lc-messages-dir = /usr/share/mysql 19 | explicit_defaults_for_timestamp 20 | 21 | # Instead of skip-networking the default is now to listen only on 22 | # localhost which is more compatible and is not less secure. 23 | bind-address = 127.0.0.1 24 | 25 | log-error = /var/log/mysql/error.log 26 | 27 | # Disabling symbolic-links is recommended to prevent assorted security risks 28 | symbolic-links=0 29 | 30 | # Recommended in standard MySQL setup 31 | sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 32 | 33 | # * IMPORTANT: Additional settings that can override those from this file! 34 | # The files must end with '.cnf', otherwise they'll be ignored. 35 | # 36 | !includedir /etc/mysql/conf.d/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 RomeOz 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Table of Contents 2 | ------------------- 3 | 4 | * [Installation](#installation) 5 | * [Quick Start](#quick-start) 6 | * [Command-line arguments](#command-line-arguments) 7 | * [Setting a specific password for the admin account](#setting-a-specific-password-for-the-admin-account) 8 | * [Creating Database at Launch](#creating-database-at-launch) 9 | * [Persistence](#persistence) 10 | * [Backuping](#backuping) 11 | * [Checking backup](#checking-backup) 12 | * [Restore from backup](#restore-from-backup) 13 | * [Replication - Master/Slave](#replication---masterslave) 14 | * [Environment variables](#environment-variables) 15 | * [Logging](#logging) 16 | * [Out of the box](#out-of-the-box) 17 | 18 | Installation 19 | ------------------- 20 | 21 | * [Install Docker 1.9+](https://docs.docker.com/installation/) or [askubuntu](http://askubuntu.com/a/473720) 22 | * Pull the latest version of the image. 23 | 24 | ```bash 25 | docker pull romeoz/docker-mysql 26 | ``` 27 | 28 | Alternately you can build the image yourself. 29 | 30 | ```bash 31 | git clone https://github.com/romeoz/docker-mysql.git 32 | cd docker-mysql 33 | docker build -t="$USER/mysql" . 34 | ``` 35 | 36 | Quick Start 37 | ------------------- 38 | 39 | Run the mysql container: 40 | 41 | ```bash 42 | docker run --name mysql -d romeoz/docker-mysql 43 | ``` 44 | 45 | The simplest way to login to the mysql container is to use the `docker exec` command to attach a new process to the running container and connect to the MySQL Server over the unix socket. 46 | 47 | ```bash 48 | docker exec -it mysql mysql -uroot 49 | ``` 50 | 51 | Command-line arguments 52 | ------------------- 53 | 54 | You can customize the launch command of mysql by specifying arguments to `mysqld` on the docker run command. For example, to run mysql using lower case table name, you can do: 55 | 56 | ```bash 57 | docker run --name db -d \ 58 | romeoz/docker-mysql \ 59 | --lower_case_table_names=1 60 | ``` 61 | 62 | Setting a specific password for the admin account 63 | ------------------------------------------------- 64 | 65 | If you want to use a preset password instead of a random generated one, you can 66 | set the environment variable `MYSQL_PASS` to your specific password when running the container: 67 | 68 | ```bash 69 | docker run --name db -d -e 'MYSQL_PASS=mypass' romeoz/docker-mysql 70 | ``` 71 | 72 | You can now test your deployment: 73 | 74 | ```bash 75 | docker exec -it db mysql -uadmin -pmypass 76 | ``` 77 | 78 | The admin username can also be set via the `MYSQL_USER` environment variable. 79 | 80 | >Remember that the `root` user has no password, but it's only accessible from within the container. 81 | 82 | Creating Database at Launch 83 | ------------------- 84 | 85 | If you want a database to be created inside the container when you start it up 86 | for the first time you can set the environment variable `DB_NAME` to a string 87 | that names the database. 88 | 89 | ```bash 90 | docker run --name mysql -d -e 'DB_NAME=dbname' romeoz/docker-mysql 91 | ``` 92 | 93 | You may also specify a comma separated list of database names in the `DB_NAME` variable. The following command creates two new databases named *dbname1* and *dbname2* (p.s. this feature is only available in releases greater than 9.1-1). 94 | 95 | ```bash 96 | docker run --name mysql -d \ 97 | -e 'DB_NAME=dbname1,dbname2' \ 98 | romeoz/docker-mysql 99 | ``` 100 | 101 | If this is combined with importing SQL files, those files will be imported into the 102 | created database. 103 | 104 | Persistence 105 | ------------------- 106 | 107 | For data persistence a volume should be mounted at `/var/lib/mysql`. 108 | 109 | SELinux users are also required to change the security context of the mount point so that it plays nicely with selinux. 110 | 111 | ```bash 112 | mkdir -p /to/path/data 113 | sudo chcon -Rt svirt_sandbox_file_t /to/path/data 114 | ``` 115 | 116 | The updated run command looks like this. 117 | 118 | ```bash 119 | docker run --name mysql -d \ 120 | -v /host/to/path/data:/var/lib/mysql \ 121 | romeoz/docker-mysql 122 | ``` 123 | 124 | This will make sure that the data stored in the database is not lost when the container is stopped and started again. 125 | 126 | Backuping 127 | ------------------- 128 | 129 | The backup all databases is made over a regular MySQL connection (used [mysqldump](https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html)). 130 | 131 | Create a temporary container for backup: 132 | 133 | ```bash 134 | docker run -it --rm \ 135 | --net mysql_net \ 136 | -e 'MYSQL_MODE=backup' \ 137 | -e 'DB_REMOTE_HOST=mysql' -e 'DB_REMOTE_USER=admin' -e 'DB_REMOTE_PASS=pass' \ 138 | -v /host/to/path/backup:/tmp/backup \ 139 | romeoz/docker-mysql 140 | ``` 141 | 142 | Archive will be available in the `/host/to/path/backup`. 143 | 144 | > Algorithm: one backup per week (total 4), one backup per month (total 12) and the last backup. Example: `backup.last.tar.bz2`, `backup.1.tar.bz2` and `/backup.dec.tar.bz2`. 145 | 146 | To pass additional settings to `mysqldump`, you can use command-line arguments: 147 | 148 | ```bash 149 | docker run -it --rm \ 150 | --net mysql_net \ 151 | -e 'MYSQL_MODE=backup' \ 152 | -e 'DB_REMOTE_HOST=mysql' -e 'DB_REMOTE_USER=admin' -e 'DB_REMOTE_PASS=pass' \ 153 | -v /host/to/path/backup:/tmp/backup \ 154 | romeoz/docker-mysql \ 155 | --master-data --single-transaction 156 | ``` 157 | 158 | Checking backup 159 | ------------------- 160 | 161 | Check-data is the name of database `DB_NAME`. 162 | 163 | ```bash 164 | docker run -it --rm \ 165 | -e 'MYSQL_CHECK=default' \ 166 | -e 'DB_NAME=foo' \ 167 | -v /host/to/path/backup:/tmp/backup \ 168 | romeoz/docker-mysql 169 | ``` 170 | 171 | Default used the `/tmp/backup/backup.last.bz2`. 172 | 173 | Restore from backup 174 | ------------------- 175 | 176 | ```bash 177 | docker run --name='db_restore' -d \ 178 | -e 'MYSQL_RESTORE=default' \ 179 | -v /host/to/path/backup:/tmp/backup \ 180 | romeoz/docker-mysql 181 | ``` 182 | 183 | Also see ["Replication"](replication---masterslave). 184 | 185 | Replication - Master/Slave 186 | ------------------------- 187 | 188 | You may use the `MYSQL_MODE` variable along with `REPLICATION_HOST`, `REPLICATION_PORT`, `REPLICATION_USER` and `REPLICATION_PASS` to enable replication. 189 | 190 | Your master database must support replication or super-user access for the credentials you specify. The `MYSQL_MODE` variable should be set to `master`, for replication on your master node and `slave` for replication or a point-in-time snapshot of a running instance. 191 | 192 | Create a master instance with database `dbname` 193 | 194 | ```bash 195 | docker network create mysql_net 196 | 197 | docker run --name='mysql-master' -d \ 198 | -e 'MYSQL_MODE=master' \ 199 | -e 'DB_NAME=dbname' \ 200 | -e 'MYSQL_USER=dbuser' -e 'MYSQL_PASS=dbpass' \ 201 | romeoz/docker-mysql 202 | ``` 203 | 204 | or import backup 205 | 206 | ```bash 207 | docker network create mysql_net 208 | 209 | docker run --name='mysql-master' -d \ 210 | -e 'MYSQL_MODE=master' \ 211 | -e 'MYSQL_RESTORE=/tmp/backup/backup.last.bz2' \ 212 | -e 'MYSQL_USER=dbuser' -e 'MYSQL_PASS=dbpass' \ 213 | -v /host/to/path/backup:/tmp/backup \ 214 | romeoz/docker-mysql 215 | ``` 216 | 217 | Create a slave instance + fast import backup from master 218 | 219 | ```bash 220 | docker run --name='mysql-slave' -d \ 221 | --net mysql_net \ 222 | -e 'MYSQL_MODE=slave' -e 'MYSQL_PASS=pass' \ 223 | -e 'REPLICATION_HOST=mysql-master' \ 224 | -e 'DB_REMOTE_USER=dbuser' -e 'DB_REMOTE_PASS=dbpass' \ 225 | romeoz/docker-mysql 226 | ``` 227 | 228 | Variables `DB_REMOTE_USER` and `DB_REMOTE_PASS` is master settings. 229 | 230 | or import as backup file 231 | 232 | ```bash 233 | docker run --name='mysql-slave' -d \ 234 | --net mysql_net \ 235 | -e 'MYSQL_MODE=slave' -e 'MYSQL_PASS=pass' \ 236 | -e 'REPLICATION_HOST=mysql-master' \ 237 | -e 'MYSQL_RESTORE=/tmp/backup/backup.last.bz2' \ 238 | -v /host/to/path/backup:/tmp/backup \ 239 | romeoz/docker-mysql 240 | ``` 241 | 242 | >Protection against unauthorized inserting records `docker exec -it mysql-slave mysql -uroot -e 'GRANT SELECT ON *.* TO "web"@"%" WITH GRANT OPTION;'` 243 | 244 | Environment variables 245 | --------------------- 246 | 247 | `MYSQL_USER`: Set a specific username for the admin account (default 'admin'). 248 | 249 | `MYSQL_PASS`: Set a specific password for the admin account. 250 | 251 | `MYSQL_MODE`: Set a specific mode. Takes on the values `master`, `slave` or `backup`. 252 | 253 | `MYSQL_BACKUP_DIR`: Set a specific backup directory (default '/tmp/backup'). 254 | 255 | `MYSQL_BACKUP_FILENAME`: Set a specific filename backup (default 'backup.last.bz2'). 256 | 257 | `MYSQL_CHECK`: Defines one SQL script/dump to initialize the database. Note that the dump must be inside the container, so you may need to mount them. You can specify as `default` that is equivalent to the `/tmp/backup/backup.last.bz2` 258 | 259 | `MYSQL_RESTORE`: Defines one or more SQL scripts/dumps separated by spaces to initialize the database. Note that the scripts must be inside the container, so you may need to mount them. You can specify as `default` that is equivalent to the `/tmp/backup/backup.last.bz2` 260 | 261 | `MYSQL_ROTATE_BACKUP`: Determines whether to use the rotation of backups (default "true"). 262 | 263 | `REPLICATION_PORT`: Set a specific replication port for the master instance (default '3306'). 264 | 265 | `REPLICATION_USER`: Set a specific replication username for the master instance (default 'replica'). 266 | 267 | `REPLICATION_PASS`: Set a specific replication password for the master instance (default 'replica'). 268 | 269 | Logging 270 | ------------------- 271 | 272 | All the logs are forwarded to stdout and sterr. You have use the command `docker logs`. 273 | 274 | ```bash 275 | docker logs mysql 276 | ``` 277 | 278 | ####Split the logs 279 | 280 | You can then simply split the stdout & stderr of the container by piping the separate streams and send them to files: 281 | 282 | ```bash 283 | docker logs mysql > stdout.log 2>stderr.log 284 | cat stdout.log 285 | cat stderr.log 286 | ``` 287 | 288 | or split stdout and error to host stdout: 289 | 290 | ```bash 291 | docker logs mysql > - 292 | docker logs mysql 2> - 293 | ``` 294 | 295 | ####Rotate logs 296 | 297 | Create the file `/etc/logrotate.d/docker-containers` with the following text inside: 298 | 299 | ``` 300 | /var/lib/docker/containers/*/*.log { 301 | rotate 31 302 | daily 303 | nocompress 304 | missingok 305 | notifempty 306 | copytruncate 307 | } 308 | ``` 309 | > Optionally, you can replace `nocompress` to `compress` and change the number of days. 310 | 311 | Out of the box 312 | ------------------- 313 | * Ubuntu 14.04 or 16.04 LTS 314 | * MySQL 5.5, 5.6 or 5.7 315 | 316 | >Environment depends on the version of MySQL. 317 | 318 | License 319 | ------------------- 320 | 321 | MySQL docker image is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT). -------------------------------------------------------------------------------- /tests/55.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | echo "-- Building mysql 5.5 image" 6 | docker build -t mysql-5.5 ../5.5/ 7 | docker network create mysql_test_net 8 | DIR_VOLUME=$(pwd)/vol55 9 | mkdir -p ${DIR_VOLUME}/backup 10 | 11 | echo 12 | echo "-- Testing mysql 5.5 is running" 13 | docker run --name base_1 -d --net mysql_test_net -e MYSQL_USER=user -e 'MYSQL_PASS=test' mysql-5.5; sleep 10 14 | docker run --name base_2 -d --net mysql_test_net mysql-5.5; sleep 10 15 | docker exec -it base_2 bash -c 'mysqladmin -uuser -ptest -h${BASE_1_PORT_3306_TCP_ADDR} ping | grep -c "mysqld is alive"' 16 | echo 17 | echo "-- Clear" 18 | docker rm -f -v base_1 base_2; sleep 5 19 | 20 | echo 21 | echo "-- Testing backup/checking on mysql 5.5" 22 | docker run --name base_1 -d --net mysql_test_net -e MYSQL_USER=user -e 'MYSQL_PASS=test' -e 'DB_NAME=db_1,test_1' mysql-5.5; sleep 10 23 | docker run -it --rm --net mysql_test_net -e 'MYSQL_MODE=backup' -e 'DB_REMOTE_HOST=base_1' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=test' -v ${DIR_VOLUME}/backup:/tmp/backup mysql-5.5; sleep 10 24 | docker run -it --rm -e 'MYSQL_CHECK=default' -e 'DB_NAME=db_1' -v ${DIR_VOLUME}/backup:/tmp/backup mysql-5.5 | tail -n 1 | grep -c 'Success'; sleep 10 25 | docker run -it --rm -e 'MYSQL_CHECK=/tmp/backup/backup.last.bz2' -e 'DB_NAME=test_1' -v ${DIR_VOLUME}/backup:/tmp/backup mysql-5.5 | tail -n 1 | grep -c 'Success'; sleep 10 26 | docker run -it --rm -e 'MYSQL_CHECK=default' -e 'DB_NAME=db' -v ${DIR_VOLUME}/backup:/tmp/backup mysql-5.5 2>&1 | tail -n 1 | grep -c 'Fail'; sleep 10 27 | echo 28 | echo "-- Clear" 29 | docker rm -f -v base_1; sleep 5 30 | rm -rf ${DIR_VOLUME} 31 | 32 | 33 | echo 34 | echo 35 | echo "-- Testing master/slave on mysql 5.5" 36 | docker run --name base_1 -d --net mysql_test_net -e 'MYSQL_MODE=master' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'DB_NAME=db_1,test_1' mysql-5.5; sleep 10 37 | docker exec -it base_1 mysql -uroot -e 'CREATE TABLE test_1.foo (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100), PRIMARY KEY(id)) ENGINE = INNODB; INSERT INTO test_1.foo (name) VALUES ("Petr");' 38 | echo 39 | echo "-- Create slave" 40 | docker run --name base_2 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=base_1' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=pass' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' mysql-5.5; sleep 10 41 | docker exec -it base_1 mysql -uroot -e 'INSERT INTO test_1.foo (name) VALUES ("Linda");'; sleep 5 42 | docker exec -it base_2 mysql -uroot -e 'SELECT * FROM test_1.foo;' | grep -c -w "Linda" 43 | echo 44 | echo "-- Backup master" 45 | mkdir -p ${DIR_VOLUME}/backup 46 | docker run -it --rm --net mysql_test_net -e 'MYSQL_MODE=backup' -e 'DB_REMOTE_HOST=base_1' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=pass' -v ${DIR_VOLUME}/backup_master:/tmp/backup mysql-5.5 --master-data --single-transaction; sleep 10 47 | echo 48 | echo "-- Restore slave from master-file" 49 | docker run --name base_3 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=base_1' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'MYSQL_RESTORE=/tmp/backup/backup.last.bz2' -v ${DIR_VOLUME}/backup_master:/tmp/backup mysql-5.5; sleep 10 50 | docker exec -it base_1 mysql -uroot -e 'INSERT INTO test_1.foo (name) VALUES ("Tom");'; sleep 5 51 | docker run --name base_4 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=base_1' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'MYSQL_RESTORE=default' -v ${DIR_VOLUME}/backup_master:/tmp/backup mysql-5.5; sleep 10 52 | docker exec -it base_3 mysql -uroot -e 'SELECT * FROM test_1.foo;' | grep -c -w "Tom" 53 | echo 54 | echo "-- Backup slave" 55 | docker run -it --rm --net mysql_test_net -e 'MYSQL_MODE=backup' -e 'DB_REMOTE_HOST=base_4' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=pass' -v ${DIR_VOLUME}/backup_slave:/tmp/backup mysql-5.5 --dump-slave; sleep 10 56 | echo 57 | echo "-- Restore slave from slave-file" 58 | docker run --name base_5 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=base_1' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'MYSQL_RESTORE=/tmp/backup/backup.last.bz2' -v ${DIR_VOLUME}/backup_slave:/tmp/backup mysql-5.5; sleep 10 59 | docker exec -it base_1 mysql -uroot -e 'INSERT INTO test_1.foo (name) VALUES ("Bob");'; sleep 5 60 | docker exec -it base_5 mysql -uroot -e 'SELECT * FROM test_1.foo;' | grep -c -w "Bob" 61 | docker exec -it base_1 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4" 62 | docker exec -it base_2 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4" 63 | docker exec -it base_3 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4" 64 | docker exec -it base_4 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4" 65 | docker exec -it base_5 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4" 66 | echo 67 | echo "-- Clear" 68 | docker rm -f -v base_1 base_2 base_3 base_4 base_5; sleep 5 69 | echo 70 | echo "-- Restore master from master-file" 71 | docker run --name restore_1 -d --net mysql_test_net -e 'MYSQL_MODE=master' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'MYSQL_RESTORE=default' -v ${DIR_VOLUME}/backup_master:/tmp/backup mysql-5.5; sleep 10 72 | docker run --name restore_2 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=restore_1' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=pass' mysql-5.5; sleep 10 73 | docker exec -it restore_1 mysql -uroot -e 'INSERT INTO test_1.foo (name) VALUES ("Romeo");'; sleep 5 74 | docker exec -it restore_1 mysql -uroot -e 'SELECT * FROM test_1.foo;' | grep -c -w "Romeo"; 75 | docker exec -it restore_1 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "3" 76 | docker exec -it restore_2 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "3" 77 | 78 | echo 79 | echo "-- Clear" 80 | docker rm -f -v restore_1 restore_2; sleep 5 81 | docker network rm mysql_test_net 82 | docker rmi mysql-5.5; sleep 5 83 | rm -rf ${DIR_VOLUME} 84 | 85 | echo 86 | echo "-- Done" -------------------------------------------------------------------------------- /tests/56.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | echo "-- Building mysql 5.6 image" 6 | docker build -t mysql-5.6 ../5.6/ 7 | docker network create mysql_test_net 8 | DIR_VOLUME=$(pwd)/vol56 9 | mkdir -p ${DIR_VOLUME}/backup 10 | 11 | echo 12 | echo "-- Testing mysql 5.6 is running" 13 | docker run --name base_1 -d --net mysql_test_net -e MYSQL_USER=user -e 'MYSQL_PASS=test' mysql-5.6; sleep 10 14 | docker run --name base_2 -d --net mysql_test_net mysql-5.6; sleep 10 15 | docker exec -it base_2 bash -c 'mysqladmin -uuser -ptest -h${BASE_1_PORT_3306_TCP_ADDR} ping | grep -c "mysqld is alive"' 16 | echo 17 | echo "-- Clear" 18 | docker rm -f -v base_1 base_2; sleep 5 19 | 20 | echo 21 | echo "-- Testing backup/checking on mysql 5.6" 22 | docker run --name base_1 -d --net mysql_test_net -e MYSQL_USER=user -e 'MYSQL_PASS=test' -e 'DB_NAME=db_1,test_1' mysql-5.6; sleep 10 23 | docker run -it --rm --net mysql_test_net -e 'MYSQL_MODE=backup' -e 'DB_REMOTE_HOST=base_1' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=test' -v ${DIR_VOLUME}/backup:/tmp/backup mysql-5.6; sleep 10 24 | docker run -it --rm -e 'MYSQL_CHECK=default' -e 'DB_NAME=db_1' -v ${DIR_VOLUME}/backup:/tmp/backup mysql-5.6 | tail -n 1 | grep -c 'Success'; sleep 10 25 | docker run -it --rm -e 'MYSQL_CHECK=/tmp/backup/backup.last.bz2' -e 'DB_NAME=test_1' -v ${DIR_VOLUME}/backup:/tmp/backup mysql-5.6 | tail -n 1 | grep -c 'Success'; sleep 10 26 | docker run -it --rm -e 'MYSQL_CHECK=default' -e 'DB_NAME=db' -v ${DIR_VOLUME}/backup:/tmp/backup mysql-5.6 2>&1 | tail -n 1 | grep -c 'Fail'; sleep 10 27 | echo 28 | echo "-- Clear" 29 | docker rm -f -v base_1; sleep 5 30 | rm -rf ${DIR_VOLUME} 31 | 32 | 33 | echo 34 | echo 35 | echo "-- Testing master/slave on mysql 5.6" 36 | docker run --name base_1 -d --net mysql_test_net -e 'MYSQL_MODE=master' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'DB_NAME=db_1,test_1' mysql-5.6; sleep 10 37 | docker exec -it base_1 mysql -uroot -e 'CREATE TABLE test_1.foo (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100), PRIMARY KEY(id)) ENGINE = INNODB; INSERT INTO test_1.foo (name) VALUES ("Petr");' 38 | echo 39 | echo "-- Create slave" 40 | docker run --name base_2 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=base_1' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=pass' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' mysql-5.6; sleep 10 41 | docker exec -it base_1 mysql -uroot -e 'INSERT INTO test_1.foo (name) VALUES ("Linda");'; sleep 5 42 | docker exec -it base_2 mysql -uroot -e 'SELECT * FROM test_1.foo;' | grep -c -w "Linda" 43 | echo 44 | echo "-- Backup master" 45 | mkdir -p ${DIR_VOLUME}/backup 46 | docker run -it --rm --net mysql_test_net -e 'MYSQL_MODE=backup' -e 'DB_REMOTE_HOST=base_1' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=pass' -v ${DIR_VOLUME}/backup_master:/tmp/backup mysql-5.6 --master-data --single-transaction; sleep 10 47 | echo 48 | echo "-- Restore slave from master-file" 49 | docker run --name base_3 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=base_1' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'MYSQL_RESTORE=/tmp/backup/backup.last.bz2' -v ${DIR_VOLUME}/backup_master:/tmp/backup mysql-5.6; sleep 10 50 | docker exec -it base_1 mysql -uroot -e 'INSERT INTO test_1.foo (name) VALUES ("Tom");'; sleep 5 51 | docker run --name base_4 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=base_1' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'MYSQL_RESTORE=default' -v ${DIR_VOLUME}/backup_master:/tmp/backup mysql-5.6; sleep 10 52 | docker exec -it base_3 mysql -uroot -e 'SELECT * FROM test_1.foo;' | grep -c -w "Tom" 53 | echo 54 | echo "-- Backup slave" 55 | docker run -it --rm --net mysql_test_net -e 'MYSQL_MODE=backup' -e 'DB_REMOTE_HOST=base_4' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=pass' -v ${DIR_VOLUME}/backup_slave:/tmp/backup mysql-5.6 --dump-slave; sleep 15 56 | echo 57 | echo "-- Restore slave from slave-file" 58 | docker run --name base_5 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=base_1' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'MYSQL_RESTORE=/tmp/backup/backup.last.bz2' -v ${DIR_VOLUME}/backup_slave:/tmp/backup mysql-5.6; sleep 15 59 | docker exec -it base_1 mysql -uroot -e 'INSERT INTO test_1.foo (name) VALUES ("Bob");'; sleep 10 60 | docker exec -it base_5 mysql -uroot -e 'SELECT * FROM test_1.foo;' | grep -c -w "Bob" 61 | docker exec -it base_1 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4";sleep 3 62 | docker exec -it base_2 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4";sleep 3 63 | docker exec -it base_3 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4";sleep 3 64 | docker exec -it base_4 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4";sleep 3 65 | docker exec -it base_5 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4" 66 | echo 67 | echo "-- Clear" 68 | docker rm -f -v base_1 base_2 base_3 base_4 base_5; sleep 5 69 | echo 70 | echo "-- Restore master from master-file" 71 | docker run --name restore_1 -d --net mysql_test_net -e 'MYSQL_MODE=master' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'MYSQL_RESTORE=default' -v ${DIR_VOLUME}/backup_master:/tmp/backup mysql-5.6; sleep 15 72 | docker run --name restore_2 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=restore_1' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=pass' mysql-5.6; sleep 15 73 | docker exec -it restore_1 mysql -uroot -e 'INSERT INTO test_1.foo (name) VALUES ("Romeo");'; sleep 5 74 | docker exec -it restore_1 mysql -uroot -e 'SELECT * FROM test_1.foo;' | grep -c -w "Romeo"; 75 | docker exec -it restore_1 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "3" 76 | docker exec -it restore_2 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "3" 77 | 78 | echo 79 | echo "-- Clear" 80 | docker rm -f -v restore_1 restore_2; sleep 5 81 | docker network rm mysql_test_net 82 | docker rmi mysql-5.6; sleep 5 83 | rm -rf ${DIR_VOLUME} 84 | 85 | echo 86 | echo "-- Done" -------------------------------------------------------------------------------- /tests/57.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | 6 | echo "-- Building mysql 5.7 image" 7 | docker build -t mysql-5.7 ../5.7/ 8 | docker network create mysql_test_net 9 | DIR_VOLUME=$(pwd)/vol57 10 | mkdir -p ${DIR_VOLUME}/backup 11 | 12 | echo 13 | echo "-- Testing mysql 5.7 is running" 14 | docker run --name base_1 -d --net mysql_test_net -e MYSQL_USER=user -e 'MYSQL_PASS=test' mysql-5.7; sleep 10 15 | docker run --name base_2 -d --net mysql_test_net mysql-5.7; sleep 10 16 | docker exec -it base_2 bash -c 'mysqladmin -uuser -ptest -h${BASE_1_PORT_3306_TCP_ADDR} ping | grep -c "mysqld is alive"' 17 | echo 18 | echo "-- Clear" 19 | docker rm -f -v base_1 base_2; sleep 5 20 | 21 | echo 22 | echo "-- Testing backup/checking on mysql 5.7" 23 | docker run --name base_1 -d --net mysql_test_net -e MYSQL_USER=user -e 'MYSQL_PASS=test' -e 'DB_NAME=db_1,test_1' mysql-5.7; sleep 10 24 | docker run -it --rm --net mysql_test_net -e 'MYSQL_MODE=backup' -e 'DB_REMOTE_HOST=base_1' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=test' -v ${DIR_VOLUME}/backup:/tmp/backup mysql-5.7; sleep 10 25 | docker run -it --rm -e 'MYSQL_CHECK=default' -e 'DB_NAME=db_1' -v ${DIR_VOLUME}/backup:/tmp/backup mysql-5.7 | tail -n 1 | grep -c 'Success'; sleep 10 26 | docker run -it --rm -e 'MYSQL_CHECK=/tmp/backup/backup.last.bz2' -e 'DB_NAME=test_1' -v ${DIR_VOLUME}/backup:/tmp/backup mysql-5.7 | tail -n 1 | grep -c 'Success'; sleep 10 27 | docker run -it --rm -e 'MYSQL_CHECK=default' -e 'DB_NAME=db' -v ${DIR_VOLUME}/backup:/tmp/backup mysql-5.7 2>&1 | tail -n 1 | grep -c 'Fail'; sleep 10 28 | echo 29 | echo "-- Clear" 30 | docker rm -f -v base_1; sleep 5 31 | rm -rf ${DIR_VOLUME} 32 | 33 | 34 | echo 35 | echo 36 | echo "-- Testing master/slave on mysql 5.7" 37 | docker run --name base_1 -d --net mysql_test_net -e 'MYSQL_MODE=master' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'DB_NAME=db_1,test_1' mysql-5.7; sleep 10 38 | docker exec -it base_1 mysql -uroot -e 'CREATE TABLE test_1.foo (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100), PRIMARY KEY(id)) ENGINE = INNODB; INSERT INTO test_1.foo (name) VALUES ("Petr");' 39 | echo 40 | echo "-- Create slave" 41 | docker run --name base_2 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=base_1' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=pass' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' mysql-5.7; sleep 20 42 | docker exec -it base_1 mysql -uroot -e 'INSERT INTO test_1.foo (name) VALUES ("Linda");'; sleep 5 43 | docker exec -it base_2 mysql -uroot -e 'SELECT * FROM test_1.foo;' | grep -c -w "Linda" 44 | echo 45 | echo "-- Backup master" 46 | docker run -it --rm --net mysql_test_net -e 'MYSQL_MODE=backup' -e 'DB_REMOTE_HOST=base_1' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=pass' -v ${DIR_VOLUME}/backup_master:/tmp/backup mysql-5.7 --master-data --single-transaction; sleep 15 47 | echo 48 | echo "-- Restore slave from master-file" 49 | docker run --name base_3 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=base_1' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'MYSQL_RESTORE=/tmp/backup/backup.last.bz2' -v ${DIR_VOLUME}/backup_master:/tmp/backup mysql-5.7; sleep 20 50 | docker exec -it base_1 mysql -uroot -e 'INSERT INTO test_1.foo (name) VALUES ("Tom");'; sleep 5 51 | docker run --name base_4 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=base_1' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'MYSQL_RESTORE=default' -v ${DIR_VOLUME}/backup_master:/tmp/backup mysql-5.7; sleep 25 52 | docker exec -it base_3 mysql -uroot -e 'SELECT * FROM test_1.foo;' | grep -c -w "Tom" 53 | echo 54 | echo "-- Backup slave" 55 | docker run -it --rm --net mysql_test_net -e 'MYSQL_MODE=backup' -e 'DB_REMOTE_HOST=base_4' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=pass' -v ${DIR_VOLUME}/backup_slave:/tmp/backup mysql-5.7 --dump-slave; sleep 15 56 | echo 57 | echo "-- Restore slave from slave-file" 58 | docker run --name base_5 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=base_1' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'MYSQL_RESTORE=/tmp/backup/backup.last.bz2' -v ${DIR_VOLUME}/backup_slave:/tmp/backup mysql-5.7; sleep 20 59 | docker exec -it base_1 mysql -uroot -e 'INSERT INTO test_1.foo (name) VALUES ("Bob");'; sleep 10 60 | docker exec -it base_5 mysql -uroot -e 'SELECT * FROM test_1.foo;' | grep -c -w "Bob" 61 | docker exec -it base_1 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4";sleep 3 62 | docker exec -it base_2 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4";sleep 3 63 | docker exec -it base_3 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4";sleep 3 64 | docker exec -it base_4 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4";sleep 3 65 | docker exec -it base_5 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "4" 66 | echo 67 | echo "-- Clear" 68 | docker rm -f -v base_1 base_2 base_3 base_4 base_5; sleep 5 69 | echo 70 | echo "-- Restore master from master-file" 71 | docker run --name restore_1 -d --net mysql_test_net -e 'MYSQL_MODE=master' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'MYSQL_RESTORE=default' -v ${DIR_VOLUME}/backup_master:/tmp/backup mysql-5.7; sleep 20 72 | docker run --name restore_2 -d --net mysql_test_net -e 'MYSQL_MODE=slave' -e 'REPLICATION_HOST=restore_1' -e MYSQL_USER=user -e 'MYSQL_PASS=pass' -e 'DB_REMOTE_USER=user' -e 'DB_REMOTE_PASS=pass' mysql-5.7; sleep 20 73 | docker exec -it restore_1 mysql -uroot -e 'INSERT INTO test_1.foo (name) VALUES ("Romeo");'; sleep 5 74 | docker exec -it restore_1 mysql -uroot -e 'SELECT * FROM test_1.foo;' | grep -c -w "Romeo"; 75 | docker exec -it restore_1 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "3" 76 | docker exec -it restore_2 mysql -uroot -e 'SELECT COUNT(*) FROM test_1.foo;' | grep -c -w "3" 77 | echo 78 | echo "-- Clear" 79 | docker rm -f -v restore_1 restore_2; sleep 5 80 | docker network rm mysql_test_net 81 | docker rmi mysql-5.7; sleep 5 82 | rm -rf ${DIR_VOLUME} 83 | 84 | echo 85 | echo "-- Done" --------------------------------------------------------------------------------