From ebfadd11aa96d30fb908116e207cbf3bd5f56c8d Mon Sep 17 00:00:00 2001 From: fermayo Date: Sat, 16 Aug 2014 23:35:36 +0200 Subject: [PATCH 01/44] refactored tags, created tests --- Dockerfile => 5.5/Dockerfile | 6 ++-- create_db.sh => 5.5/create_db.sh | 0 .../create_mysql_admin_user.sh | 0 import_sql.sh => 5.5/import_sql.sh | 0 my.cnf => 5.5/my.cnf | 0 mysqld_charset.cnf => 5.5/mysqld_charset.cnf | 0 run.sh => 5.5/run.sh | 3 ++ 5.6/Dockerfile | 31 ++++++++++++++++ 5.6/create_db.sh | 20 +++++++++++ 5.6/create_mysql_admin_user.sh | 36 +++++++++++++++++++ 5.6/import_sql.sh | 19 ++++++++++ 5.6/my.cnf | 2 ++ 5.6/mysqld_charset.cnf | 7 ++++ 5.6/run.sh | 18 ++++++++++ README.md | 6 ++-- circle.yml | 13 +++++++ 16 files changed, 155 insertions(+), 6 deletions(-) rename Dockerfile => 5.5/Dockerfile (82%) rename create_db.sh => 5.5/create_db.sh (100%) rename create_mysql_admin_user.sh => 5.5/create_mysql_admin_user.sh (100%) rename import_sql.sh => 5.5/import_sql.sh (100%) rename my.cnf => 5.5/my.cnf (100%) rename mysqld_charset.cnf => 5.5/mysqld_charset.cnf (100%) rename run.sh => 5.5/run.sh (74%) create mode 100644 5.6/Dockerfile create mode 100755 5.6/create_db.sh create mode 100644 5.6/create_mysql_admin_user.sh create mode 100755 5.6/import_sql.sh create mode 100644 5.6/my.cnf create mode 100644 5.6/mysqld_charset.cnf create mode 100644 5.6/run.sh create mode 100644 circle.yml diff --git a/Dockerfile b/5.5/Dockerfile similarity index 82% rename from Dockerfile rename to 5.5/Dockerfile index 1279137..3388abe 100644 --- a/Dockerfile +++ b/5.5/Dockerfile @@ -2,8 +2,10 @@ FROM ubuntu:trusty MAINTAINER Fernando Mayo , Feng Honglin # Install packages -RUN apt-get update -RUN DEBIAN_FRONTEND=noninteractive apt-get -y install mysql-server pwgen +ENV DEBIAN_FRONTEND noninteractive +RUN apt-get update && \ + apt-get -yq install mysql-server-5.5 pwgen && \ + rm -rf /var/lib/apt/lists/* # Remove pre-installed database RUN rm -rf /var/lib/mysql/* diff --git a/create_db.sh b/5.5/create_db.sh similarity index 100% rename from create_db.sh rename to 5.5/create_db.sh diff --git a/create_mysql_admin_user.sh b/5.5/create_mysql_admin_user.sh similarity index 100% rename from create_mysql_admin_user.sh rename to 5.5/create_mysql_admin_user.sh diff --git a/import_sql.sh b/5.5/import_sql.sh similarity index 100% rename from import_sql.sh rename to 5.5/import_sql.sh diff --git a/my.cnf b/5.5/my.cnf similarity index 100% rename from my.cnf rename to 5.5/my.cnf diff --git a/mysqld_charset.cnf b/5.5/mysqld_charset.cnf similarity index 100% rename from mysqld_charset.cnf rename to 5.5/mysqld_charset.cnf diff --git a/run.sh b/5.5/run.sh similarity index 74% rename from run.sh rename to 5.5/run.sh index fc223ab..ff4b7b1 100644 --- a/run.sh +++ b/5.5/run.sh @@ -5,6 +5,9 @@ VOLUME_HOME="/var/lib/mysql" 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 > /dev/null 2>&1 echo "=> Done!" /create_mysql_admin_user.sh diff --git a/5.6/Dockerfile b/5.6/Dockerfile new file mode 100644 index 0000000..7fc526f --- /dev/null +++ b/5.6/Dockerfile @@ -0,0 +1,31 @@ +FROM ubuntu:trusty +MAINTAINER Fernando Mayo , Feng Honglin + +# Install packages +ENV DEBIAN_FRONTEND noninteractive +RUN apt-get update && \ + apt-get -yq install mysql-server-5.6 pwgen && \ + rm -rf /var/lib/apt/lists/* + +# Remove pre-installed database +RUN rm -rf /var/lib/mysql/* + +# 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 scripts +ADD create_mysql_admin_user.sh /create_mysql_admin_user.sh +ADD import_sql.sh /import_sql.sh +ADD run.sh /run.sh +RUN chmod 755 /*.sh + +# Exposed ENV +ENV MYSQL_USER admin +ENV MYSQL_PASS **Random** + +# Add VOLUMEs to allow backup of config and databases +VOLUME ["/etc/mysql", "/var/lib/mysql"] + +EXPOSE 3306 +CMD ["/run.sh"] diff --git a/5.6/create_db.sh b/5.6/create_db.sh new file mode 100755 index 0000000..26fdfd7 --- /dev/null +++ b/5.6/create_db.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +if [[ $# -eq 0 ]]; then + echo "Usage: $0 " + exit 1 +fi + +/usr/bin/mysqld_safe > /dev/null 2>&1 & + +echo "=> Creating database $1" +RET=1 +while [[ RET -ne 0 ]]; do + sleep 5 + mysql -uroot -e "CREATE DATABASE $1" + RET=$? +done + +mysqladmin -uroot shutdown + +echo "=> Done!" diff --git a/5.6/create_mysql_admin_user.sh b/5.6/create_mysql_admin_user.sh new file mode 100644 index 0000000..666ed68 --- /dev/null +++ b/5.6/create_mysql_admin_user.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +/usr/bin/mysqld_safe > /dev/null 2>&1 & + +RET=1 +while [[ RET -ne 0 ]]; do + echo "=> Waiting for confirmation of MySQL service startup" + sleep 5 + mysql -uroot -e "status" > /dev/null 2>&1 + RET=$? +done + +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 -P" +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 "========================================================================" + +mysqladmin -uroot shutdown diff --git a/5.6/import_sql.sh b/5.6/import_sql.sh new file mode 100755 index 0000000..f8a2ac6 --- /dev/null +++ b/5.6/import_sql.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +if [[ $# -ne 2 ]]; then + echo "Usage: $0 " + exit 1 +fi + +echo "=> Starting MySQL Server" +/usr/bin/mysqld_safe > /dev/null 2>&1 & +sleep 5 +echo " Started with PID $!" + +echo "=> Importing SQL file" +mysql -uadmin -p"$1" < "$2" + +echo "=> Stopping MySQL Server" +mysqladmin -uadmin -p"$1" shutdown + +echo "=> Done!" diff --git a/5.6/my.cnf b/5.6/my.cnf new file mode 100644 index 0000000..84e7bbf --- /dev/null +++ b/5.6/my.cnf @@ -0,0 +1,2 @@ +[mysqld] +bind-address=0.0.0.0 diff --git a/5.6/mysqld_charset.cnf b/5.6/mysqld_charset.cnf new file mode 100644 index 0000000..2c9c4f1 --- /dev/null +++ b/5.6/mysqld_charset.cnf @@ -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 \ No newline at end of file diff --git a/5.6/run.sh b/5.6/run.sh new file mode 100644 index 0000000..ff4b7b1 --- /dev/null +++ b/5.6/run.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +VOLUME_HOME="/var/lib/mysql" + +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 > /dev/null 2>&1 + echo "=> Done!" + /create_mysql_admin_user.sh +else + echo "=> Using an existing volume of MySQL" +fi + +exec mysqld_safe diff --git a/README.md b/README.md index 123a9d8..a035ecd 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,7 @@ Base docker image to run a MySQL database server MySQL version ------------- -`master` branch maintains MySQL from Ubuntu trusty official source. If you want to get different version of MySQL, please checkout `5.5` branch and `5.6` branch. - -If you want to use MariaDB, please check our `tutum/mariadb` image: https://github.com/tutumcloud/tutum-docker-mariadb +Different versions are built from different folders. If you want to use MariaDB, please check our `tutum/mariadb` image: https://github.com/tutumcloud/tutum-docker-mariadb Usage @@ -17,7 +15,7 @@ Usage To create the image `tutum/mysql`, execute the following command on the tutum-mysql folder: - docker build -t tutum/mysql . + docker build -t tutum/mysql 5.5/ To run the image and bind to port 3306: diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000..360ad77 --- /dev/null +++ b/circle.yml @@ -0,0 +1,13 @@ +machine: + services: + - docker +dependencies: + override: + - docker build -t mysql-5.5 5.5/ + - docker build -t mysql-5.6 5.6/ +test: + override: + - docker run -d -p 13306:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" mysql-5.5; sleep 20 + - mysqladmin -uuser -ptest ping -h127.0.0.1 -P13306 | grep -c "mysqld is alive" + - docker run -d -p 13307:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" mysql-5.6; sleep 20 + - mysqladmin -uuser -ptest ping -h127.0.0.1 -P13307 | grep -c "mysqld is alive" \ No newline at end of file From c8fa873c537bfe102b31e26d00327edd1d29d299 Mon Sep 17 00:00:00 2001 From: tifayuki Date: Thu, 21 Aug 2014 15:52:04 -0400 Subject: [PATCH 02/44] resolve #23 --- 5.5/import_sql.sh | 8 ++++---- 5.6/import_sql.sh | 8 ++++---- README.md | 40 ++++++++++++++++++++-------------------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/5.5/import_sql.sh b/5.5/import_sql.sh index f8a2ac6..306bae4 100755 --- a/5.5/import_sql.sh +++ b/5.5/import_sql.sh @@ -1,7 +1,7 @@ #!/bin/bash -if [[ $# -ne 2 ]]; then - echo "Usage: $0 " +if [[ $# -ne 3 ]]; then + echo "Usage: $0 " exit 1 fi @@ -11,9 +11,9 @@ sleep 5 echo " Started with PID $!" echo "=> Importing SQL file" -mysql -uadmin -p"$1" < "$2" +mysql -u"$1" -p"$2" < "$3" echo "=> Stopping MySQL Server" -mysqladmin -uadmin -p"$1" shutdown +mysqladmin -u"$1" -p"$2" shutdown echo "=> Done!" diff --git a/5.6/import_sql.sh b/5.6/import_sql.sh index f8a2ac6..306bae4 100755 --- a/5.6/import_sql.sh +++ b/5.6/import_sql.sh @@ -1,7 +1,7 @@ #!/bin/bash -if [[ $# -ne 2 ]]; then - echo "Usage: $0 " +if [[ $# -ne 3 ]]; then + echo "Usage: $0 " exit 1 fi @@ -11,9 +11,9 @@ sleep 5 echo " Started with PID $!" echo "=> Importing SQL file" -mysql -uadmin -p"$1" < "$2" +mysql -u"$1" -p"$2" < "$3" echo "=> Stopping MySQL Server" -mysqladmin -uadmin -p"$1" shutdown +mysqladmin -u"$1" -p"$2" shutdown echo "=> Done!" diff --git a/README.md b/README.md index a035ecd..0f33fa2 100644 --- a/README.md +++ b/README.md @@ -15,36 +15,36 @@ Usage To create the image `tutum/mysql`, execute the following command on the tutum-mysql folder: - docker build -t tutum/mysql 5.5/ + docker build -t tutum/mysql 5.5/ To run the image and bind to port 3306: - docker run -d -p 3306:3306 tutum/mysql + docker run -d -p 3306:3306 tutum/mysql The first time that you run your container, a new user `admin` with all privileges will be created in MySQL with a random password. To get the password, check the logs of the container by running: - docker logs + docker logs You will see an output like the following: - ======================================================================== - You can now connect to this MySQL Server using: + ======================================================================== + You can now connect to this MySQL Server using: - mysql -uadmin -p47nnf4FweaKu -h -P + mysql -uadmin -p47nnf4FweaKu -h -P - Please remember to change the above password as soon as possible! - MySQL user 'root' has no password but only allows local connections - ======================================================================== + Please remember to change the above password as soon as possible! + MySQL user 'root' has no password but only allows local connections + ======================================================================== In this case, `47nnf4FweaKu` is the password allocated to the `admin` user. -Remember that the `root` user has no password but it's only accesible from within the container. +Remember that the `root` user has no password but it's only accessible from within the container. You can now test your deployment: - mysql -uadmin -p + mysql -uadmin -p Done! @@ -55,11 +55,11 @@ Setting a specific password for the admin account If you want to use a preset password instead of a random generated one, you can set the environment variable `MYSQL_PASS` to your specific password when running the container: - docker run -d -p 3306:3306 -e MYSQL_PASS="mypass" tutum/mysql + docker run -d -p 3306:3306 -e MYSQL_PASS="mypass" tutum/mysql You can now test your deployment: - mysql -uadmin -p"mypass" + mysql -uadmin -p"mypass" The admin username can also be set via the MYSQL_USER environment variable. @@ -70,7 +70,7 @@ Mounting the database file volume In order to persist the database data, you can mount a local folder from the host on the container to store the database files. To do so: - docker run -d -v /path/in/host:/var/lib/mysql tutum/mysql /bin/bash -c "/usr/bin/mysql_install_db" + docker run -d -v /path/in/host:/var/lib/mysql tutum/mysql /bin/bash -c "/usr/bin/mysql_install_db" This will mount the local folder `/path/in/host` inside the docker in `/var/lib/mysql` (where MySQL will store the database files by default). `mysql_install_db` creates the initial database structure. @@ -78,7 +78,7 @@ Remember that this will mean that your host must have `/path/in/host` available After this you can start your mysql image but this time using `/path/in/host` as the database folder: - docker run -d -p 3306:3306 -v /path/in/host:/var/lib/mysql tutum/mysql + docker run -d -p 3306:3306 -v /path/in/host:/var/lib/mysql tutum/mysql Mounting the database file volume from other containers @@ -104,17 +104,17 @@ In order to migrate your current MySQL server, perform the following commands fr To dump your databases structure: - mysqldump -u -p --opt -d -B > /tmp/dbserver_schema.sql + mysqldump -u -p --opt -d -B > /tmp/dbserver_schema.sql To dump your database data: - mysqldump -u -p --quick --single-transaction -t -n -B > /tmp/dbserver_data.sql + mysqldump -u -p --quick --single-transaction -t -n -B > /tmp/dbserver_data.sql To import a SQL backup which is stored for example in the folder `/tmp` in the host, run the following: - sudo docker run -d -v /tmp:/tmp tutum/mysql /bin/bash -c "/import_sql.sh /tmp/") + sudo docker run -d -v /tmp:/tmp tutum/mysql /bin/bash -c "/import_sql.sh /tmp/" -Where `` is the root password set earlier and `` is the name of the SQL file to be imported. +Where `` and `` are the database username and password set earlier and `` is the name of the SQL file to be imported. Environment variables @@ -123,7 +123,7 @@ Environment variables `MYSQL_USER`: Set a specific username for the admin account (default 'admin') `MYSQL_PASS`: Set a specific password for the admin account. -Compatibliity Issues +Compatibiliity Issues -------------------- - Volume created by MySQL 5.6 cannot be used in MySQL 5.5 Images or MariaDB images From 566fa422ad81767da907dc30b122e5ae761e1843 Mon Sep 17 00:00:00 2001 From: tifayuki Date: Thu, 21 Aug 2014 17:05:36 -0400 Subject: [PATCH 03/44] check the start up of mysql before importing, ref #24 --- 5.5/import_sql.sh | 13 +++++++++++-- 5.6/import_sql.sh | 13 +++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/5.5/import_sql.sh b/5.5/import_sql.sh index 306bae4..995e6c9 100755 --- a/5.5/import_sql.sh +++ b/5.5/import_sql.sh @@ -7,8 +7,17 @@ fi echo "=> Starting MySQL Server" /usr/bin/mysqld_safe > /dev/null 2>&1 & -sleep 5 -echo " Started with PID $!" +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" diff --git a/5.6/import_sql.sh b/5.6/import_sql.sh index 306bae4..995e6c9 100755 --- a/5.6/import_sql.sh +++ b/5.6/import_sql.sh @@ -7,8 +7,17 @@ fi echo "=> Starting MySQL Server" /usr/bin/mysqld_safe > /dev/null 2>&1 & -sleep 5 -echo " Started with PID $!" +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" From 6f5d6cd8d995d51f782efef68c9e5b448248d2c9 Mon Sep 17 00:00:00 2001 From: tifayuki Date: Tue, 9 Sep 2014 18:29:30 -0400 Subject: [PATCH 04/44] add MySQL master/slave replicaiton --- 5.5/Dockerfile | 6 +++++ 5.5/my.cnf | 2 ++ 5.5/run.sh | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5.6/Dockerfile | 6 +++++ 5.6/my.cnf | 2 ++ 5.6/run.sh | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 13 +++++++++- 7 files changed, 166 insertions(+), 1 deletion(-) diff --git a/5.5/Dockerfile b/5.5/Dockerfile index 3388abe..2fa1405 100644 --- a/5.5/Dockerfile +++ b/5.5/Dockerfile @@ -24,6 +24,12 @@ RUN chmod 755 /*.sh ENV MYSQL_USER admin ENV MYSQL_PASS **Random** +# Replication ENV +ENV REPLICATION_MASTER **False** +ENV REPLICATION_SLAVE **False** +ENV REPLICATION_USER replica +ENV REPLICAITON_PASS replica + # Add VOLUMEs to allow backup of config and databases VOLUME ["/etc/mysql", "/var/lib/mysql"] diff --git a/5.5/my.cnf b/5.5/my.cnf index 84e7bbf..c574c80 100644 --- a/5.5/my.cnf +++ b/5.5/my.cnf @@ -1,2 +1,4 @@ [mysqld] bind-address=0.0.0.0 +#server-id +#log-bin diff --git a/5.5/run.sh b/5.5/run.sh index ff4b7b1..cb950e0 100644 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -1,6 +1,27 @@ #!/bin/bash VOLUME_HOME="/var/lib/mysql" +CONF_FILE="/etc/mysql/conf.d/my.cnf" + +StartMySQL () +{ + /usr/bin/mysqld_safe > /dev/null 2>&1 & + RET=1 + while [[ RET -ne 0 ]]; do + echo "=> Waiting for confirmation of MySQL service startup" + sleep 5 + mysql -uroot -e "status" > /dev/null 2>&1 + RET=$? + done +} + +if [ ${REPLICATION_MASTER} == "**False**" ]; then + unset REPLICATION_MASTER +fi + +if [ ${REPLICATION_SLAVE} == "**False**" ]; then + unset REPLICATION_SLAVE +fi if [[ ! -d $VOLUME_HOME/mysql ]]; then echo "=> An empty or uninitialized MySQL volume is detected in $VOLUME_HOME" @@ -10,9 +31,57 @@ if [[ ! -d $VOLUME_HOME/mysql ]]; then fi mysql_install_db > /dev/null 2>&1 echo "=> Done!" + echo "=> Creating admin user ..." /create_mysql_admin_user.sh else echo "=> Using an existing volume of MySQL" fi + +# Set MySQL REPLICATION - MASTER +if [ -n "${REPLICATION_MASTER}" ]; then + echo "=> Configuring MySQL replicaiton as master ..." + if [ ! -f /repliation_configured ]; 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} + echo "=> Starting MySQL ..." + StartMySQL + 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}'@'%'" + echo "=> Done!" + mysqladmin -uroot shutdown + touch /repliation_configured + else + echo "=> MySQL replication master already configured, skip" + fi +fi + +# Set MySQL REPLICATION - SLAVE +if [ -n "${REPLICATION_SLAVE}" ]; then + echo "=> Configuring MySQL replicaiton as slave ..." + if [ -n "${MYSQL_PORT_3306_TCP_ADDR}" ] && [ -n "${MYSQL_PORT_3306_TCP_PORT}" ]; then + if [ ! -f /repliation_configured ]; 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} + echo "=> Starting MySQL ..." + StartMySQL + 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" + echo "=> Done!" + mysqladmin -uroot shutdown + touch /repliation_configured + else + echo "=> MySQL replicaiton 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 + exec mysqld_safe diff --git a/5.6/Dockerfile b/5.6/Dockerfile index 7fc526f..5a74291 100644 --- a/5.6/Dockerfile +++ b/5.6/Dockerfile @@ -24,6 +24,12 @@ RUN chmod 755 /*.sh ENV MYSQL_USER admin ENV MYSQL_PASS **Random** +# Replication ENV +ENV REPLICATION_MASTER **False** +ENV REPLICATION_SLAVE **False** +ENV REPLICATION_USER replica +ENV REPLICAITON_PASS replica + # Add VOLUMEs to allow backup of config and databases VOLUME ["/etc/mysql", "/var/lib/mysql"] diff --git a/5.6/my.cnf b/5.6/my.cnf index 84e7bbf..c574c80 100644 --- a/5.6/my.cnf +++ b/5.6/my.cnf @@ -1,2 +1,4 @@ [mysqld] bind-address=0.0.0.0 +#server-id +#log-bin diff --git a/5.6/run.sh b/5.6/run.sh index ff4b7b1..cb950e0 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -1,6 +1,27 @@ #!/bin/bash VOLUME_HOME="/var/lib/mysql" +CONF_FILE="/etc/mysql/conf.d/my.cnf" + +StartMySQL () +{ + /usr/bin/mysqld_safe > /dev/null 2>&1 & + RET=1 + while [[ RET -ne 0 ]]; do + echo "=> Waiting for confirmation of MySQL service startup" + sleep 5 + mysql -uroot -e "status" > /dev/null 2>&1 + RET=$? + done +} + +if [ ${REPLICATION_MASTER} == "**False**" ]; then + unset REPLICATION_MASTER +fi + +if [ ${REPLICATION_SLAVE} == "**False**" ]; then + unset REPLICATION_SLAVE +fi if [[ ! -d $VOLUME_HOME/mysql ]]; then echo "=> An empty or uninitialized MySQL volume is detected in $VOLUME_HOME" @@ -10,9 +31,57 @@ if [[ ! -d $VOLUME_HOME/mysql ]]; then fi mysql_install_db > /dev/null 2>&1 echo "=> Done!" + echo "=> Creating admin user ..." /create_mysql_admin_user.sh else echo "=> Using an existing volume of MySQL" fi + +# Set MySQL REPLICATION - MASTER +if [ -n "${REPLICATION_MASTER}" ]; then + echo "=> Configuring MySQL replicaiton as master ..." + if [ ! -f /repliation_configured ]; 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} + echo "=> Starting MySQL ..." + StartMySQL + 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}'@'%'" + echo "=> Done!" + mysqladmin -uroot shutdown + touch /repliation_configured + else + echo "=> MySQL replication master already configured, skip" + fi +fi + +# Set MySQL REPLICATION - SLAVE +if [ -n "${REPLICATION_SLAVE}" ]; then + echo "=> Configuring MySQL replicaiton as slave ..." + if [ -n "${MYSQL_PORT_3306_TCP_ADDR}" ] && [ -n "${MYSQL_PORT_3306_TCP_PORT}" ]; then + if [ ! -f /repliation_configured ]; 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} + echo "=> Starting MySQL ..." + StartMySQL + 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" + echo "=> Done!" + mysqladmin -uroot shutdown + touch /repliation_configured + else + echo "=> MySQL replicaiton 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 + exec mysqld_safe diff --git a/README.md b/README.md index 0f33fa2..723d973 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ You can now test your deployment: mysql -uadmin -p"mypass" -The admin username can also be set via the MYSQL_USER environment variable. +The admin username can also be set via the `MYSQL_USER` environment variable. Mounting the database file volume @@ -117,6 +117,17 @@ To import a SQL backup which is stored for example in the folder `/tmp` in the h Where `` and `` are the database username and password set earlier and `` is the name of the SQL file to be imported. +Relication - Master/Slave +------------------------- +To use MySQL replication, please set environment variable `REPLICATION_MASTER`/`REPLICATION_SLAVE` to `ture`. Also, on master side, you may want to specify `REPLICATION_USER` and `REPLICATION_PASS` for the account to perform replicaiton, the default value is `replica:replica` + +Examples: +- Master MySQL + docker run -d -e REPLICATION_MASTER=true -e REPLICATION_PASS=mypass -p 3306:3306 --name mysql tutum/mysql +- Example on Slave MySQL: + docker run -d -e REPLICATION_SLAVE=true -p 3307:3306 --link mysql:mysql tutum/mysql + +Now, you can access port `3306` and `3307` for the master/slave mysql Environment variables --------------------- From 7a27ac09f0f3da1eeee55d9ae1f26a2c53b1c0e7 Mon Sep 17 00:00:00 2001 From: Feng Honglin Date: Wed, 10 Sep 2014 22:50:34 -0400 Subject: [PATCH 05/44] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 723d973..d3c815d 100644 --- a/README.md +++ b/README.md @@ -123,8 +123,11 @@ To use MySQL replication, please set environment variable `REPLICATION_MASTER`/` Examples: - Master MySQL +- docker run -d -e REPLICATION_MASTER=true -e REPLICATION_PASS=mypass -p 3306:3306 --name mysql tutum/mysql + - Example on Slave MySQL: +- docker run -d -e REPLICATION_SLAVE=true -p 3307:3306 --link mysql:mysql tutum/mysql Now, you can access port `3306` and `3307` for the master/slave mysql From 8c28bc12e178ea2e0da40f368e5fe5fee8100ce7 Mon Sep 17 00:00:00 2001 From: Emagma Date: Thu, 11 Sep 2014 14:38:23 +0200 Subject: [PATCH 06/44] Fixed typo REPLICAITON --- 5.5/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5.5/Dockerfile b/5.5/Dockerfile index 2fa1405..494dd20 100644 --- a/5.5/Dockerfile +++ b/5.5/Dockerfile @@ -28,7 +28,7 @@ ENV MYSQL_PASS **Random** ENV REPLICATION_MASTER **False** ENV REPLICATION_SLAVE **False** ENV REPLICATION_USER replica -ENV REPLICAITON_PASS replica +ENV REPLICATION_PASS replica # Add VOLUMEs to allow backup of config and databases VOLUME ["/etc/mysql", "/var/lib/mysql"] From 6bd6fef23da3b854274a45149750cf657d82eaf3 Mon Sep 17 00:00:00 2001 From: Emagma Date: Thu, 11 Sep 2014 14:40:11 +0200 Subject: [PATCH 07/44] Fixed typo REPLICAITON --- 5.6/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5.6/Dockerfile b/5.6/Dockerfile index 5a74291..3bb0741 100644 --- a/5.6/Dockerfile +++ b/5.6/Dockerfile @@ -28,7 +28,7 @@ ENV MYSQL_PASS **Random** ENV REPLICATION_MASTER **False** ENV REPLICATION_SLAVE **False** ENV REPLICATION_USER replica -ENV REPLICAITON_PASS replica +ENV REPLICATION_PASS replica # Add VOLUMEs to allow backup of config and databases VOLUME ["/etc/mysql", "/var/lib/mysql"] From 2c7ea439ea10b3ac9b6872ec883ee504c7153f54 Mon Sep 17 00:00:00 2001 From: tifayuki Date: Thu, 11 Sep 2014 11:34:13 -0400 Subject: [PATCH 08/44] add tests: repliation --- README.md | 6 +++--- circle.yml | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d3c815d..846dbf9 100644 --- a/README.md +++ b/README.md @@ -117,9 +117,9 @@ To import a SQL backup which is stored for example in the folder `/tmp` in the h Where `` and `` are the database username and password set earlier and `` is the name of the SQL file to be imported. -Relication - Master/Slave +Replication - Master/Slave ------------------------- -To use MySQL replication, please set environment variable `REPLICATION_MASTER`/`REPLICATION_SLAVE` to `ture`. Also, on master side, you may want to specify `REPLICATION_USER` and `REPLICATION_PASS` for the account to perform replicaiton, the default value is `replica:replica` +To use MySQL replication, please set environment variable `REPLICATION_MASTER`/`REPLICATION_SLAVE` to `ture`. Also, on master side, you may want to specify `REPLICATION_USER` and `REPLICATION_PASS` for the account to perform replication, the default value is `replica:replica` Examples: - Master MySQL @@ -137,7 +137,7 @@ Environment variables `MYSQL_USER`: Set a specific username for the admin account (default 'admin') `MYSQL_PASS`: Set a specific password for the admin account. -Compatibiliity Issues +Compatibility Issues -------------------- - Volume created by MySQL 5.6 cannot be used in MySQL 5.5 Images or MariaDB images diff --git a/circle.yml b/circle.yml index 360ad77..eb6d365 100644 --- a/circle.yml +++ b/circle.yml @@ -7,7 +7,21 @@ dependencies: - docker build -t mysql-5.6 5.6/ test: override: + # test mysql 5.5 - docker run -d -p 13306:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" mysql-5.5; sleep 20 - - mysqladmin -uuser -ptest ping -h127.0.0.1 -P13306 | grep -c "mysqld is alive" + - mysqladmin -uuser -ptest -h127.0.0.1 -P13306 ping | grep -c "mysqld is alive" + # test mysql 5.6 - docker run -d -p 13307:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" mysql-5.6; sleep 20 - - mysqladmin -uuser -ptest ping -h127.0.0.1 -P13307 | grep -c "mysqld is alive" \ No newline at end of file + - mysqladmin -uuser -ptest -h127.0.0.1 -P13307 ping | grep -c "mysqld is alive" + # test replication 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 13308:3306 --name mysql55master mysql-5.5; sleep 20 + - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 13309:3306 --link mysql55master:mysql mysql-5.5; sleep 20 + - docker logs mysql55master | grep "repl:repl" + - mysql -uuser -ptest -h127.0.0.1 -P13308 -e "show master status\G;" | grep "mysql-bin.*" + - mysql -uuser -ptest -h127.0.0.1 -P13309 -e "show slave status\G;" | grep "Slave_IO_Running.*Yes" + # test replication 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 13310:3306 --name mysql56master mysql-5.6; sleep 20 + - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 13311:3306 --link mysql56master:mysql mysql-5.6; sleep 20 + - docker logs mysql56master | grep "repl:repl" + - mysql -uuser -ptest -h127.0.0.1 -P13310 -e "show master status\G;" | grep "mysql-bin.*" + - mysql -uuser -ptest -h127.0.0.1 -P13311 -e "show slave status\G;" | grep "Slave_IO_Running.*Yes" From cc1bde5a8b557dda9e45fc4a52fe93cda3b59de5 Mon Sep 17 00:00:00 2001 From: MarkVLK Date: Mon, 15 Sep 2014 17:13:28 -0700 Subject: [PATCH 09/44] Fix "replication" typos --- 5.6/run.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/5.6/run.sh b/5.6/run.sh index cb950e0..95267b9 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -40,8 +40,8 @@ fi # Set MySQL REPLICATION - MASTER if [ -n "${REPLICATION_MASTER}" ]; then - echo "=> Configuring MySQL replicaiton as master ..." - if [ ! -f /repliation_configured ]; then + echo "=> Configuring MySQL replication as master ..." + if [ ! -f /replication_configured ]; 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} @@ -53,7 +53,7 @@ if [ -n "${REPLICATION_MASTER}" ]; then mysql -uroot -e "GRANT REPLICATION SLAVE ON *.* TO '${REPLICATION_USER}'@'%'" echo "=> Done!" mysqladmin -uroot shutdown - touch /repliation_configured + touch /replication_configured else echo "=> MySQL replication master already configured, skip" fi @@ -61,9 +61,9 @@ fi # Set MySQL REPLICATION - SLAVE if [ -n "${REPLICATION_SLAVE}" ]; then - echo "=> Configuring MySQL replicaiton as slave ..." + echo "=> Configuring MySQL replication as slave ..." if [ -n "${MYSQL_PORT_3306_TCP_ADDR}" ] && [ -n "${MYSQL_PORT_3306_TCP_PORT}" ]; then - if [ ! -f /repliation_configured ]; then + if [ ! -f /replication_configured ]; 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} @@ -74,9 +74,9 @@ if [ -n "${REPLICATION_SLAVE}" ]; then 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" echo "=> Done!" mysqladmin -uroot shutdown - touch /repliation_configured + touch /replication_configured else - echo "=> MySQL replicaiton slave already configured, skip" + echo "=> MySQL replication slave already configured, skip" fi else echo "=> Cannot configure slave, please link it to another MySQL container with alias as 'mysql'" From 42e0a2fc11bef2a1afa77c2b0cab4c0ea90c7351 Mon Sep 17 00:00:00 2001 From: Frank Lemanschik Date: Sat, 20 Sep 2014 11:30:24 +0200 Subject: [PATCH 10/44] Update my.cnf --- 5.6/my.cnf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/5.6/my.cnf b/5.6/my.cnf index c574c80..02fe8be 100644 --- a/5.6/my.cnf +++ b/5.6/my.cnf @@ -1,4 +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 From 72fb586f2880ffeb1655a15d9ae372bfabfb691f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Juan=20Lagunas?= Date: Tue, 14 Oct 2014 22:16:20 -0500 Subject: [PATCH 11/44] Fixes spelling --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 846dbf9..ec91b4e 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ Where `` and `` are the database username and password set earlier a Replication - Master/Slave ------------------------- -To use MySQL replication, please set environment variable `REPLICATION_MASTER`/`REPLICATION_SLAVE` to `ture`. Also, on master side, you may want to specify `REPLICATION_USER` and `REPLICATION_PASS` for the account to perform replication, the default value is `replica:replica` +To use MySQL replication, please set environment variable `REPLICATION_MASTER`/`REPLICATION_SLAVE` to `true`. Also, on master side, you may want to specify `REPLICATION_USER` and `REPLICATION_PASS` for the account to perform replication, the default value is `replica:replica` Examples: - Master MySQL From 70087154d07354fc1e642beba9fd3639180617b7 Mon Sep 17 00:00:00 2001 From: tifayuki Date: Mon, 3 Nov 2014 10:16:01 +0000 Subject: [PATCH 12/44] fix #38 --- 5.5/run.sh | 4 ++++ 5.6/run.sh | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/5.5/run.sh b/5.5/run.sh index cb950e0..4d19311 100644 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -3,6 +3,10 @@ VOLUME_HOME="/var/lib/mysql" CONF_FILE="/etc/mysql/conf.d/my.cnf" +# Set permission of config file +chmod 644 ${CONF_FILE} +chmod 644 /etc/mysql/conf.d/mysqld_charset.cnf + StartMySQL () { /usr/bin/mysqld_safe > /dev/null 2>&1 & diff --git a/5.6/run.sh b/5.6/run.sh index 95267b9..852d3e0 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -3,6 +3,10 @@ VOLUME_HOME="/var/lib/mysql" CONF_FILE="/etc/mysql/conf.d/my.cnf" +# Set permission of config file +chmod 644 ${CONF_FILE} +chmod 644 /etc/mysql/conf.d/mysqld_charset.cnf + StartMySQL () { /usr/bin/mysqld_safe > /dev/null 2>&1 & From 9eacc85401e6d2d88756c304f1f594218e8cd7f1 Mon Sep 17 00:00:00 2001 From: tifayuki Date: Mon, 3 Nov 2014 12:21:05 +0000 Subject: [PATCH 13/44] move create_mysql_admin_user.sh to a function in run.sh --- 5.5/Dockerfile | 1 - 5.5/create_mysql_admin_user.sh | 36 --------------------------- 5.5/run.sh | 45 ++++++++++++++++++++++++++++------ 5.6/Dockerfile | 1 - 5.6/create_mysql_admin_user.sh | 36 --------------------------- 5.6/run.sh | 33 +++++++++++++++++++++++-- 6 files changed, 68 insertions(+), 84 deletions(-) delete mode 100644 5.5/create_mysql_admin_user.sh delete mode 100644 5.6/create_mysql_admin_user.sh diff --git a/5.5/Dockerfile b/5.5/Dockerfile index 494dd20..83ad601 100644 --- a/5.5/Dockerfile +++ b/5.5/Dockerfile @@ -15,7 +15,6 @@ ADD my.cnf /etc/mysql/conf.d/my.cnf ADD mysqld_charset.cnf /etc/mysql/conf.d/mysqld_charset.cnf # Add MySQL scripts -ADD create_mysql_admin_user.sh /create_mysql_admin_user.sh ADD import_sql.sh /import_sql.sh ADD run.sh /run.sh RUN chmod 755 /*.sh diff --git a/5.5/create_mysql_admin_user.sh b/5.5/create_mysql_admin_user.sh deleted file mode 100644 index 666ed68..0000000 --- a/5.5/create_mysql_admin_user.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -/usr/bin/mysqld_safe > /dev/null 2>&1 & - -RET=1 -while [[ RET -ne 0 ]]; do - echo "=> Waiting for confirmation of MySQL service startup" - sleep 5 - mysql -uroot -e "status" > /dev/null 2>&1 - RET=$? -done - -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 -P" -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 "========================================================================" - -mysqladmin -uroot shutdown diff --git a/5.5/run.sh b/5.5/run.sh index 4d19311..064a016 100644 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -1,4 +1,4 @@ -#!/bin/bash +e!/bin/bash VOLUME_HOME="/var/lib/mysql" CONF_FILE="/etc/mysql/conf.d/my.cnf" @@ -19,6 +19,35 @@ StartMySQL () done } +CreateMySQLUser() +{ + StartMySQL + 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 -P" + 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 "========================================================================" + + mysqladmin -uroot shutdown +} + if [ ${REPLICATION_MASTER} == "**False**" ]; then unset REPLICATION_MASTER fi @@ -36,7 +65,7 @@ if [[ ! -d $VOLUME_HOME/mysql ]]; then mysql_install_db > /dev/null 2>&1 echo "=> Done!" echo "=> Creating admin user ..." - /create_mysql_admin_user.sh + CreateMySQLUser else echo "=> Using an existing volume of MySQL" fi @@ -44,8 +73,8 @@ fi # Set MySQL REPLICATION - MASTER if [ -n "${REPLICATION_MASTER}" ]; then - echo "=> Configuring MySQL replicaiton as master ..." - if [ ! -f /repliation_configured ]; then + echo "=> Configuring MySQL replication as master ..." + if [ ! -f /replication_configured ]; 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} @@ -57,7 +86,7 @@ if [ -n "${REPLICATION_MASTER}" ]; then mysql -uroot -e "GRANT REPLICATION SLAVE ON *.* TO '${REPLICATION_USER}'@'%'" echo "=> Done!" mysqladmin -uroot shutdown - touch /repliation_configured + touch /replication_configured else echo "=> MySQL replication master already configured, skip" fi @@ -65,9 +94,9 @@ fi # Set MySQL REPLICATION - SLAVE if [ -n "${REPLICATION_SLAVE}" ]; then - echo "=> Configuring MySQL replicaiton as slave ..." + echo "=> Configuring MySQL replication as slave ..." if [ -n "${MYSQL_PORT_3306_TCP_ADDR}" ] && [ -n "${MYSQL_PORT_3306_TCP_PORT}" ]; then - if [ ! -f /repliation_configured ]; then + if [ ! -f /replication_configured ]; 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} @@ -78,7 +107,7 @@ if [ -n "${REPLICATION_SLAVE}" ]; then 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" echo "=> Done!" mysqladmin -uroot shutdown - touch /repliation_configured + touch /replication_configured else echo "=> MySQL replicaiton slave already configured, skip" fi diff --git a/5.6/Dockerfile b/5.6/Dockerfile index 3bb0741..30329f2 100644 --- a/5.6/Dockerfile +++ b/5.6/Dockerfile @@ -15,7 +15,6 @@ ADD my.cnf /etc/mysql/conf.d/my.cnf ADD mysqld_charset.cnf /etc/mysql/conf.d/mysqld_charset.cnf # Add MySQL scripts -ADD create_mysql_admin_user.sh /create_mysql_admin_user.sh ADD import_sql.sh /import_sql.sh ADD run.sh /run.sh RUN chmod 755 /*.sh diff --git a/5.6/create_mysql_admin_user.sh b/5.6/create_mysql_admin_user.sh deleted file mode 100644 index 666ed68..0000000 --- a/5.6/create_mysql_admin_user.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -/usr/bin/mysqld_safe > /dev/null 2>&1 & - -RET=1 -while [[ RET -ne 0 ]]; do - echo "=> Waiting for confirmation of MySQL service startup" - sleep 5 - mysql -uroot -e "status" > /dev/null 2>&1 - RET=$? -done - -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 -P" -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 "========================================================================" - -mysqladmin -uroot shutdown diff --git a/5.6/run.sh b/5.6/run.sh index 852d3e0..8e81bd8 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -19,6 +19,35 @@ StartMySQL () done } +CreateMySQLUser() +{ + StartMySQL + 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 -P" + 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 "========================================================================" + + mysqladmin -uroot shutdown +} + if [ ${REPLICATION_MASTER} == "**False**" ]; then unset REPLICATION_MASTER fi @@ -36,7 +65,7 @@ if [[ ! -d $VOLUME_HOME/mysql ]]; then mysql_install_db > /dev/null 2>&1 echo "=> Done!" echo "=> Creating admin user ..." - /create_mysql_admin_user.sh + CreateMySQLUser else echo "=> Using an existing volume of MySQL" fi @@ -80,7 +109,7 @@ if [ -n "${REPLICATION_SLAVE}" ]; then mysqladmin -uroot shutdown touch /replication_configured else - echo "=> MySQL replication slave already configured, skip" + echo "=> MySQL replicaiton slave already configured, skip" fi else echo "=> Cannot configure slave, please link it to another MySQL container with alias as 'mysql'" From 8bc32e8c3a25d8c93deddba4a6fc9c017226861d Mon Sep 17 00:00:00 2001 From: tifayuki Date: Tue, 4 Nov 2014 12:32:23 +0000 Subject: [PATCH 14/44] fix #39 --- 5.5/run.sh | 19 +++++++++++++------ 5.6/run.sh | 17 ++++++++++++----- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/5.5/run.sh b/5.5/run.sh index 064a016..404fd95 100644 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -1,7 +1,8 @@ -e!/bin/bash +#!/bin/bash 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} @@ -10,12 +11,18 @@ chmod 644 /etc/mysql/conf.d/mysqld_charset.cnf StartMySQL () { /usr/bin/mysqld_safe > /dev/null 2>&1 & - RET=1 - while [[ RET -ne 0 ]]; do - echo "=> Waiting for confirmation of MySQL service startup" + + # Time out in 1 minute + LOOP_LIMIT=13 + 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 5 - mysql -uroot -e "status" > /dev/null 2>&1 - RET=$? + mysql -uroot -e "status" > /dev/null 2>&1 && break done } diff --git a/5.6/run.sh b/5.6/run.sh index 8e81bd8..404fd95 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -2,6 +2,7 @@ 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} @@ -10,12 +11,18 @@ chmod 644 /etc/mysql/conf.d/mysqld_charset.cnf StartMySQL () { /usr/bin/mysqld_safe > /dev/null 2>&1 & - RET=1 - while [[ RET -ne 0 ]]; do - echo "=> Waiting for confirmation of MySQL service startup" + + # Time out in 1 minute + LOOP_LIMIT=13 + 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 5 - mysql -uroot -e "status" > /dev/null 2>&1 - RET=$? + mysql -uroot -e "status" > /dev/null 2>&1 && break done } From b9e0c061e620cd65758c120aa2a1c4e08fd85ce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gast=C3=B3n=20Fournier?= Date: Fri, 7 Nov 2014 14:55:44 -0300 Subject: [PATCH 15/44] Support to define one or more startup scripts --- 5.5/run.sh | 25 +++++++++++++++++++++++++ 5.6/run.sh | 26 ++++++++++++++++++++++++++ README.md | 1 + 3 files changed, 52 insertions(+) diff --git a/5.5/run.sh b/5.5/run.sh index 404fd95..1c0b33d 100644 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -55,6 +55,27 @@ CreateMySQLUser() mysqladmin -uroot shutdown } +ImportSql() +{ + StartMySQL + + RET=1 + while [[ RET -ne 0 ]]; do + echo "=> Waiting for confirmation of MySQL service startup" + sleep 5 + mysql -u"${MYSQL_USER}" -p"${PASS}" -e "status" > /dev/null 2>&1 + RET=$? + done + + echo " Started with PID ${PID}" + + for FILE in ${STARTUP_SQL}; do + echo "=> Importing SQL file ${FILE}" + mysql -u"${MYSQL_USER}" -p"${PASS}" < "${FILE}" + done + + mysqladmin -uroot shutdown +} if [ ${REPLICATION_MASTER} == "**False**" ]; then unset REPLICATION_MASTER fi @@ -77,6 +98,10 @@ else echo "=> Using an existing volume of MySQL" fi +if [ -n "${STARTUP_SQL}" ]; then + echo "=> Initializing DB with ${STARTUP_SQL}" + ImportSql +fi # Set MySQL REPLICATION - MASTER if [ -n "${REPLICATION_MASTER}" ]; then diff --git a/5.6/run.sh b/5.6/run.sh index 404fd95..feb1967 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -55,6 +55,28 @@ CreateMySQLUser() mysqladmin -uroot shutdown } +ImportSql() +{ + StartMySQL + + RET=1 + while [[ RET -ne 0 ]]; do + echo "=> Waiting for confirmation of MySQL service startup" + sleep 5 + mysql -u"${MYSQL_USER}" -p"${PASS}" -e "status" > /dev/null 2>&1 + RET=$? + done + + echo " Started with PID ${PID}" + + for FILE in ${STARTUP_SQL}; do + echo "=> Importing SQL file ${FILE}" + mysql -u"${MYSQL_USER}" -p"${PASS}" < "${FILE}" + done + + mysqladmin -uroot shutdown +} + if [ ${REPLICATION_MASTER} == "**False**" ]; then unset REPLICATION_MASTER fi @@ -77,6 +99,10 @@ else echo "=> Using an existing volume of MySQL" fi +if [ -n "${STARTUP_SQL}" ]; then + echo "=> Initializing DB with ${STARTUP_SQL}" + ImportSql +fi # Set MySQL REPLICATION - MASTER if [ -n "${REPLICATION_MASTER}" ]; then diff --git a/README.md b/README.md index ec91b4e..f4ef5f4 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,7 @@ Environment variables `MYSQL_USER`: Set a specific username for the admin account (default 'admin') `MYSQL_PASS`: Set a specific password for the admin account. +`STARTUP_SQL`: Defines one or more sql scripts separated by spaces to initialize the database. Note that the scripts must be inside the conainer so you may need to mount them Compatibility Issues -------------------- From 698076e38b2427537d332c20cd43009f63310a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gast=C3=B3n=20Fournier?= Date: Fri, 7 Nov 2014 15:02:33 -0300 Subject: [PATCH 16/44] Fixed some stuff in README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index f4ef5f4..2815af9 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,10 @@ To import a SQL backup which is stored for example in the folder `/tmp` in the h sudo docker run -d -v /tmp:/tmp tutum/mysql /bin/bash -c "/import_sql.sh /tmp/" +Also you can start the new database initializing it with the SQL file: + + sudo docker run -d -v /path/in/host:/var/lib/mysql -e STARTUP_SQL="/tmp/" tutum/mysql + Where `` and `` are the database username and password set earlier and `` is the name of the SQL file to be imported. @@ -135,7 +139,9 @@ Environment variables --------------------- `MYSQL_USER`: Set a specific username for the admin account (default 'admin') + `MYSQL_PASS`: Set a specific password for the admin account. + `STARTUP_SQL`: Defines one or more sql scripts separated by spaces to initialize the database. Note that the scripts must be inside the conainer so you may need to mount them Compatibility Issues From fb46611b703110e0964e5c091a00d87ff5733dea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gast=C3=B3n=20Fournier?= Date: Wed, 12 Nov 2014 15:37:14 -0300 Subject: [PATCH 17/44] Usage of root user to initialize database and changed to only initialize it when the DB is installed --- 5.5/run.sh | 22 +++++++--------------- 5.6/run.sh | 22 ++++++---------------- 2 files changed, 13 insertions(+), 31 deletions(-) diff --git a/5.5/run.sh b/5.5/run.sh index 1c0b33d..810b056 100644 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -59,23 +59,14 @@ ImportSql() { StartMySQL - RET=1 - while [[ RET -ne 0 ]]; do - echo "=> Waiting for confirmation of MySQL service startup" - sleep 5 - mysql -u"${MYSQL_USER}" -p"${PASS}" -e "status" > /dev/null 2>&1 - RET=$? - done - - echo " Started with PID ${PID}" - for FILE in ${STARTUP_SQL}; do echo "=> Importing SQL file ${FILE}" - mysql -u"${MYSQL_USER}" -p"${PASS}" < "${FILE}" + mysql -uroot < "${FILE}" done mysqladmin -uroot shutdown } + if [ ${REPLICATION_MASTER} == "**False**" ]; then unset REPLICATION_MASTER fi @@ -94,14 +85,15 @@ if [[ ! -d $VOLUME_HOME/mysql ]]; then echo "=> Done!" echo "=> Creating admin user ..." CreateMySQLUser + + if [ -n "${STARTUP_SQL}" ]; then + echo "=> Initializing DB with ${STARTUP_SQL}" + ImportSql + fi else echo "=> Using an existing volume of MySQL" fi -if [ -n "${STARTUP_SQL}" ]; then - echo "=> Initializing DB with ${STARTUP_SQL}" - ImportSql -fi # Set MySQL REPLICATION - MASTER if [ -n "${REPLICATION_MASTER}" ]; then diff --git a/5.6/run.sh b/5.6/run.sh index feb1967..58e199d 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -59,19 +59,9 @@ ImportSql() { StartMySQL - RET=1 - while [[ RET -ne 0 ]]; do - echo "=> Waiting for confirmation of MySQL service startup" - sleep 5 - mysql -u"${MYSQL_USER}" -p"${PASS}" -e "status" > /dev/null 2>&1 - RET=$? - done - - echo " Started with PID ${PID}" - for FILE in ${STARTUP_SQL}; do echo "=> Importing SQL file ${FILE}" - mysql -u"${MYSQL_USER}" -p"${PASS}" < "${FILE}" + mysql -uroot < "${FILE}" done mysqladmin -uroot shutdown @@ -95,15 +85,15 @@ if [[ ! -d $VOLUME_HOME/mysql ]]; then echo "=> Done!" echo "=> Creating admin user ..." CreateMySQLUser + + if [ -n "${STARTUP_SQL}" ]; then + echo "=> Initializing DB with ${STARTUP_SQL}" + ImportSql + fi else echo "=> Using an existing volume of MySQL" fi -if [ -n "${STARTUP_SQL}" ]; then - echo "=> Initializing DB with ${STARTUP_SQL}" - ImportSql -fi - # Set MySQL REPLICATION - MASTER if [ -n "${REPLICATION_MASTER}" ]; then echo "=> Configuring MySQL replication as master ..." From 506f793866ad1c2d47ee284394c59d9e3a940091 Mon Sep 17 00:00:00 2001 From: pierreozoux Date: Tue, 2 Dec 2014 19:20:48 +0000 Subject: [PATCH 18/44] Removes syslog warning --- 5.5/Dockerfile | 3 +++ 5.6/Dockerfile | 3 +++ 2 files changed, 6 insertions(+) diff --git a/5.5/Dockerfile b/5.5/Dockerfile index 83ad601..be8c0a0 100644 --- a/5.5/Dockerfile +++ b/5.5/Dockerfile @@ -10,6 +10,9 @@ RUN apt-get update && \ # Remove pre-installed database RUN rm -rf /var/lib/mysql/* +# Remove syslog configuration +RUN rm /etc/mysql/conf.d/mysqld_safe_syslog.cnf + # Add MySQL configuration ADD my.cnf /etc/mysql/conf.d/my.cnf ADD mysqld_charset.cnf /etc/mysql/conf.d/mysqld_charset.cnf diff --git a/5.6/Dockerfile b/5.6/Dockerfile index 30329f2..7c8fa31 100644 --- a/5.6/Dockerfile +++ b/5.6/Dockerfile @@ -10,6 +10,9 @@ RUN apt-get update && \ # Remove pre-installed database RUN rm -rf /var/lib/mysql/* +# Remove syslog configuration +RUN rm /etc/mysql/conf.d/mysqld_safe_syslog.cnf + # Add MySQL configuration ADD my.cnf /etc/mysql/conf.d/my.cnf ADD mysqld_charset.cnf /etc/mysql/conf.d/mysqld_charset.cnf From 0f3c1c1a551d847d1860b1f84c739a8b3ccc7768 Mon Sep 17 00:00:00 2001 From: tifayuki Date: Tue, 20 Jan 2015 20:47:00 +0800 Subject: [PATCH 19/44] update circle.yml --- circle.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/circle.yml b/circle.yml index eb6d365..17287e6 100644 --- a/circle.yml +++ b/circle.yml @@ -8,20 +8,22 @@ dependencies: test: override: # test mysql 5.5 - - docker run -d -p 13306:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" mysql-5.5; sleep 20 + - docker run -d -p 13306:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" mysql-5.5; sleep 30 - mysqladmin -uuser -ptest -h127.0.0.1 -P13306 ping | grep -c "mysqld is alive" # test mysql 5.6 - - docker run -d -p 13307:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" mysql-5.6; sleep 20 + - docker run -d -p 13307:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" mysql-5.6; sleep 30 - mysqladmin -uuser -ptest -h127.0.0.1 -P13307 ping | grep -c "mysqld is alive" # test replication 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 13308:3306 --name mysql55master mysql-5.5; sleep 20 - - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 13309:3306 --link mysql55master:mysql mysql-5.5; sleep 20 + - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_MASTER=true -e REPLICATION_USER=repl -e REPLICATION_PASS=repl -p 13308:3306 --name mysql55master mysql-5.5; sleep 30 + - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 13309:3306 --link mysql55master:mysql mysql-5.5; sleep 30 - docker logs mysql55master | grep "repl:repl" - mysql -uuser -ptest -h127.0.0.1 -P13308 -e "show master status\G;" | grep "mysql-bin.*" - mysql -uuser -ptest -h127.0.0.1 -P13309 -e "show slave status\G;" | grep "Slave_IO_Running.*Yes" + - mysql -uuser -ptest -h127.0.0.1 -P13309 -e "show slave status\G;" | grep "Slave_SQL_Running.*Yes" # test replication 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 13310:3306 --name mysql56master mysql-5.6; sleep 20 - - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 13311:3306 --link mysql56master:mysql mysql-5.6; sleep 20 + - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_MASTER=true -e REPLICATION_USER=repl -e REPLICATION_PASS=repl -p 13310:3306 --name mysql56master mysql-5.6; sleep 30 + - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 13311:3306 --link mysql56master:mysql mysql-5.6; sleep 30 - docker logs mysql56master | grep "repl:repl" - mysql -uuser -ptest -h127.0.0.1 -P13310 -e "show master status\G;" | grep "mysql-bin.*" - mysql -uuser -ptest -h127.0.0.1 -P13311 -e "show slave status\G;" | grep "Slave_IO_Running.*Yes" + - mysql -uuser -ptest -h127.0.0.1 -P13311 -e "show slave status\G;" | grep "Slave_SQL_Running.*Yes" From 666cd847d5b0a57729c2cddf205a27ec1de0e71c Mon Sep 17 00:00:00 2001 From: tifayuki Date: Tue, 20 Jan 2015 21:34:27 +0800 Subject: [PATCH 20/44] fix #46 --- 5.5/run.sh | 14 ++++++++++---- 5.6/run.sh | 13 ++++++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/5.5/run.sh b/5.5/run.sh index 810b056..685ce93 100644 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -67,6 +67,7 @@ ImportSql() mysqladmin -uroot shutdown } +# Main if [ ${REPLICATION_MASTER} == "**False**" ]; then unset REPLICATION_MASTER fi @@ -75,6 +76,7 @@ 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 ..." @@ -85,13 +87,17 @@ if [[ ! -d $VOLUME_HOME/mysql ]]; then echo "=> Done!" echo "=> Creating admin user ..." CreateMySQLUser - - if [ -n "${STARTUP_SQL}" ]; then +else + echo "=> Using an existing volume of MySQL" +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 -else - echo "=> Using an existing volume of MySQL" fi diff --git a/5.6/run.sh b/5.6/run.sh index 58e199d..685ce93 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -67,6 +67,7 @@ ImportSql() mysqladmin -uroot shutdown } +# Main if [ ${REPLICATION_MASTER} == "**False**" ]; then unset REPLICATION_MASTER fi @@ -75,6 +76,7 @@ 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 ..." @@ -85,15 +87,20 @@ if [[ ! -d $VOLUME_HOME/mysql ]]; then echo "=> Done!" echo "=> Creating admin user ..." CreateMySQLUser +else + echo "=> Using an existing volume of MySQL" +fi - if [ -n "${STARTUP_SQL}" ]; then +# Import Startup SQL +if [ -n "${STARTUP_SQL}" ]; then + if [ ! -f /sql_imported ]; then echo "=> Initializing DB with ${STARTUP_SQL}" ImportSql + touch /sql_imported fi -else - echo "=> Using an existing volume of MySQL" fi + # Set MySQL REPLICATION - MASTER if [ -n "${REPLICATION_MASTER}" ]; then echo "=> Configuring MySQL replication as master ..." From d6b82885494d4d71a2d7dbc55f5ec6f343da27d5 Mon Sep 17 00:00:00 2001 From: tifayuki Date: Wed, 21 Jan 2015 16:12:50 +0800 Subject: [PATCH 21/44] tail error log to stderr --- 5.5/run.sh | 1 + 5.6/run.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/5.5/run.sh b/5.5/run.sh index 685ce93..424bd26 100644 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -147,4 +147,5 @@ if [ -n "${REPLICATION_SLAVE}" ]; then fi fi +tail -F $LOG & exec mysqld_safe diff --git a/5.6/run.sh b/5.6/run.sh index 685ce93..424bd26 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -147,4 +147,5 @@ if [ -n "${REPLICATION_SLAVE}" ]; then fi fi +tail -F $LOG & exec mysqld_safe From e4f60f0664811def6dc2ad9b0d5237695edeac2c Mon Sep 17 00:00:00 2001 From: fermayo Date: Sun, 25 Jan 2015 03:32:17 +0100 Subject: [PATCH 22/44] add skip_name_resolve to mysql 5.5 --- 5.5/my.cnf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/5.5/my.cnf b/5.5/my.cnf index c574c80..02fe8be 100644 --- a/5.5/my.cnf +++ b/5.5/my.cnf @@ -1,4 +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 From fd60db743b1da2b7b9335af5f68b602713805acb Mon Sep 17 00:00:00 2001 From: Jeff Standen Date: Sat, 31 Jan 2015 00:06:08 -0800 Subject: [PATCH 23/44] Minor README.md proofreading. --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 2815af9..823c71c 100644 --- a/README.md +++ b/README.md @@ -35,12 +35,12 @@ You will see an output like the following: mysql -uadmin -p47nnf4FweaKu -h -P Please remember to change the above password as soon as possible! - MySQL user 'root' has no password but only allows local connections + MySQL user 'root' has no password but only allows local connections. ======================================================================== In this case, `47nnf4FweaKu` is the password allocated to the `admin` user. -Remember that the `root` user has no password but it's only accessible from within the container. +Remember that the `root` user has no password, but it's only accessible from within the container. You can now test your deployment: @@ -76,7 +76,7 @@ This will mount the local folder `/path/in/host` inside the docker in `/var/lib/ Remember that this will mean that your host must have `/path/in/host` available when you run your docker image! -After this you can start your mysql image but this time using `/path/in/host` as the database folder: +After this you can start your MySQL image, but this time using `/path/in/host` as the database folder: docker run -d -p 3306:3306 -v /path/in/host:/var/lib/mysql tutum/mysql @@ -114,7 +114,7 @@ To import a SQL backup which is stored for example in the folder `/tmp` in the h sudo docker run -d -v /tmp:/tmp tutum/mysql /bin/bash -c "/import_sql.sh /tmp/" -Also you can start the new database initializing it with the SQL file: +Also, you can start the new database initializing it with the SQL file: sudo docker run -d -v /path/in/host:/var/lib/mysql -e STARTUP_SQL="/tmp/" tutum/mysql @@ -134,17 +134,18 @@ Examples: - docker run -d -e REPLICATION_SLAVE=true -p 3307:3306 --link mysql:mysql tutum/mysql -Now, you can access port `3306` and `3307` for the master/slave mysql +Now you can access port `3306` and `3307` for the master/slave MySQL. + Environment variables --------------------- -`MYSQL_USER`: Set a specific username for the admin account (default 'admin') +`MYSQL_USER`: Set a specific username for the admin account (default 'admin'). `MYSQL_PASS`: Set a specific password for the admin account. -`STARTUP_SQL`: Defines one or more sql scripts separated by spaces to initialize the database. Note that the scripts must be inside the conainer so you may need to mount them +`STARTUP_SQL`: Defines one or more SQL scripts separated by spaces to initialize the database. Note that the scripts must be inside the container, so you may need to mount them. Compatibility Issues -------------------- -- Volume created by MySQL 5.6 cannot be used in MySQL 5.5 Images or MariaDB images +- Volume created by MySQL 5.6 cannot be used in MySQL 5.5 Images or MariaDB images. From 716efd8482fcf80faee437c6ab386a1f7baa3eb7 Mon Sep 17 00:00:00 2001 From: tifayuki Date: Tue, 31 Mar 2015 17:05:34 +0200 Subject: [PATCH 24/44] remove "create_db.sh" from repo --- 5.5/create_db.sh | 20 -------------------- 5.5/import_sql.sh | 0 5.6/create_db.sh | 20 -------------------- 5.6/import_sql.sh | 0 4 files changed, 40 deletions(-) delete mode 100755 5.5/create_db.sh mode change 100755 => 100644 5.5/import_sql.sh delete mode 100755 5.6/create_db.sh mode change 100755 => 100644 5.6/import_sql.sh diff --git a/5.5/create_db.sh b/5.5/create_db.sh deleted file mode 100755 index 26fdfd7..0000000 --- a/5.5/create_db.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -if [[ $# -eq 0 ]]; then - echo "Usage: $0 " - exit 1 -fi - -/usr/bin/mysqld_safe > /dev/null 2>&1 & - -echo "=> Creating database $1" -RET=1 -while [[ RET -ne 0 ]]; do - sleep 5 - mysql -uroot -e "CREATE DATABASE $1" - RET=$? -done - -mysqladmin -uroot shutdown - -echo "=> Done!" diff --git a/5.5/import_sql.sh b/5.5/import_sql.sh old mode 100755 new mode 100644 diff --git a/5.6/create_db.sh b/5.6/create_db.sh deleted file mode 100755 index 26fdfd7..0000000 --- a/5.6/create_db.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -if [[ $# -eq 0 ]]; then - echo "Usage: $0 " - exit 1 -fi - -/usr/bin/mysqld_safe > /dev/null 2>&1 & - -echo "=> Creating database $1" -RET=1 -while [[ RET -ne 0 ]]; do - sleep 5 - mysql -uroot -e "CREATE DATABASE $1" - RET=$? -done - -mysqladmin -uroot shutdown - -echo "=> Done!" diff --git a/5.6/import_sql.sh b/5.6/import_sql.sh old mode 100755 new mode 100644 From 265eb1db052ffd4ee88306212bbf30a338deabd9 Mon Sep 17 00:00:00 2001 From: Richard Weber Date: Wed, 6 May 2015 13:01:29 +0300 Subject: [PATCH 25/44] Added the ability to create a database with an environment variable. If a user wants to create a database when the container is created all they have to do is supply the MYSQL_DB environment variable. --- 5.5/Dockerfile | 1 + 5.5/run.sh | 20 +++++++++++++++----- 5.6/Dockerfile | 1 + 5.6/run.sh | 20 +++++++++++++++----- README.md | 25 ++++++++++++++++++------- 5 files changed, 50 insertions(+), 17 deletions(-) diff --git a/5.5/Dockerfile b/5.5/Dockerfile index be8c0a0..be72d95 100644 --- a/5.5/Dockerfile +++ b/5.5/Dockerfile @@ -25,6 +25,7 @@ RUN chmod 755 /*.sh # Exposed ENV ENV MYSQL_USER admin ENV MYSQL_PASS **Random** +ENV ON_CREATE_DB **False** # Replication ENV ENV REPLICATION_MASTER **False** diff --git a/5.5/run.sh b/5.5/run.sh index 424bd26..0ff6005 100644 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -29,6 +29,16 @@ StartMySQL () CreateMySQLUser() { StartMySQL + + #Setup DB + 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 + if [ "$MYSQL_PASS" = "**Random**" ]; then unset MYSQL_PASS fi @@ -82,9 +92,9 @@ if [[ ! -d $VOLUME_HOME/mysql ]]; then echo "=> Installing MySQL ..." if [ ! -f /usr/share/mysql/my-default.cnf ] ; then cp /etc/mysql/my.cnf /usr/share/mysql/my-default.cnf - fi + fi mysql_install_db > /dev/null 2>&1 - echo "=> Done!" + echo "=> Done!" echo "=> Creating admin user ..." CreateMySQLUser else @@ -102,7 +112,7 @@ fi # Set MySQL REPLICATION - MASTER -if [ -n "${REPLICATION_MASTER}" ]; then +if [ -n "${REPLICATION_MASTER}" ]; then echo "=> Configuring MySQL replication as master ..." if [ ! -f /replication_configured ]; then RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})" @@ -123,7 +133,7 @@ if [ -n "${REPLICATION_MASTER}" ]; then fi # Set MySQL REPLICATION - SLAVE -if [ -n "${REPLICATION_SLAVE}" ]; then +if [ -n "${REPLICATION_SLAVE}" ]; then echo "=> Configuring MySQL replication as slave ..." if [ -n "${MYSQL_PORT_3306_TCP_ADDR}" ] && [ -n "${MYSQL_PORT_3306_TCP_PORT}" ]; then if [ ! -f /replication_configured ]; then @@ -141,7 +151,7 @@ if [ -n "${REPLICATION_SLAVE}" ]; then else echo "=> MySQL replicaiton slave already configured, skip" fi - else + else echo "=> Cannot configure slave, please link it to another MySQL container with alias as 'mysql'" exit 1 fi diff --git a/5.6/Dockerfile b/5.6/Dockerfile index 7c8fa31..32703cc 100644 --- a/5.6/Dockerfile +++ b/5.6/Dockerfile @@ -25,6 +25,7 @@ RUN chmod 755 /*.sh # Exposed ENV ENV MYSQL_USER admin ENV MYSQL_PASS **Random** +ENV ON_CREATE_DB **False** # Replication ENV ENV REPLICATION_MASTER **False** diff --git a/5.6/run.sh b/5.6/run.sh index 424bd26..0ff6005 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -29,6 +29,16 @@ StartMySQL () CreateMySQLUser() { StartMySQL + + #Setup DB + 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 + if [ "$MYSQL_PASS" = "**Random**" ]; then unset MYSQL_PASS fi @@ -82,9 +92,9 @@ if [[ ! -d $VOLUME_HOME/mysql ]]; then echo "=> Installing MySQL ..." if [ ! -f /usr/share/mysql/my-default.cnf ] ; then cp /etc/mysql/my.cnf /usr/share/mysql/my-default.cnf - fi + fi mysql_install_db > /dev/null 2>&1 - echo "=> Done!" + echo "=> Done!" echo "=> Creating admin user ..." CreateMySQLUser else @@ -102,7 +112,7 @@ fi # Set MySQL REPLICATION - MASTER -if [ -n "${REPLICATION_MASTER}" ]; then +if [ -n "${REPLICATION_MASTER}" ]; then echo "=> Configuring MySQL replication as master ..." if [ ! -f /replication_configured ]; then RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})" @@ -123,7 +133,7 @@ if [ -n "${REPLICATION_MASTER}" ]; then fi # Set MySQL REPLICATION - SLAVE -if [ -n "${REPLICATION_SLAVE}" ]; then +if [ -n "${REPLICATION_SLAVE}" ]; then echo "=> Configuring MySQL replication as slave ..." if [ -n "${MYSQL_PORT_3306_TCP_ADDR}" ] && [ -n "${MYSQL_PORT_3306_TCP_PORT}" ]; then if [ ! -f /replication_configured ]; then @@ -141,7 +151,7 @@ if [ -n "${REPLICATION_SLAVE}" ]; then else echo "=> MySQL replicaiton slave already configured, skip" fi - else + else echo "=> Cannot configure slave, please link it to another MySQL container with alias as 'mysql'" exit 1 fi diff --git a/README.md b/README.md index 823c71c..c08b2c0 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ To run the image and bind to port 3306: docker run -d -p 3306:3306 tutum/mysql -The first time that you run your container, a new user `admin` with all privileges +The first time that you run your container, a new user `admin` with all privileges will be created in MySQL with a random password. To get the password, check the logs of the container by running: @@ -64,10 +64,21 @@ You can now test your deployment: The admin username can also be set via the `MYSQL_USER` environment variable. + +Creating a database on container creation +------------------------------------------------- + +If you want a database to be created inside the container when you start it up +for the first time you can set the environment variable `MYSQL_DB` to string +that names the database. + + docker run -d -p 3306:3306 -e ON_CREATE_DB="database" tutum/mysql + + Mounting the database file volume --------------------------------- -In order to persist the database data, you can mount a local folder from the host +In order to persist the database data, you can mount a local folder from the host on the container to store the database files. To do so: docker run -d -v /path/in/host:/var/lib/mysql tutum/mysql /bin/bash -c "/usr/bin/mysql_install_db" @@ -87,14 +98,14 @@ Mounting the database file volume from other containers Another way to persist the database data is to store database files in another container. To do so, first create a container that holds database files: - docker run -d -v /var/lib/mysql --name db_vol -p 22:22 tutum/ubuntu-trusty + docker run -d -v /var/lib/mysql --name db_vol -p 22:22 tutum/ubuntu-trusty -This will create a new ssh-enabled container and use its folder `/var/lib/mysql` to store MySQL database files. +This will create a new ssh-enabled container and use its folder `/var/lib/mysql` to store MySQL database files. You can specify any name of the container by using `--name` option, which will be used in next step. After this you can start your MySQL image using volumes in the container created above (put the name of container in `--volumes-from`) - docker run -d --volumes-from db_vol -p 3306:3306 tutum/mysql + docker run -d --volumes-from db_vol -p 3306:3306 tutum/mysql Migrating an existing MySQL Server @@ -127,11 +138,11 @@ To use MySQL replication, please set environment variable `REPLICATION_MASTER`/` Examples: - Master MySQL -- +- docker run -d -e REPLICATION_MASTER=true -e REPLICATION_PASS=mypass -p 3306:3306 --name mysql tutum/mysql - Example on Slave MySQL: -- +- docker run -d -e REPLICATION_SLAVE=true -p 3307:3306 --link mysql:mysql tutum/mysql Now you can access port `3306` and `3307` for the master/slave MySQL. From b254b2cfc3fa09f91930b2ed4a8ef3e4f97f1cce Mon Sep 17 00:00:00 2001 From: Richard Weber Date: Thu, 7 May 2015 08:16:41 +0300 Subject: [PATCH 26/44] Fixed a syntax error. --- 5.5/run.sh | 2 +- 5.6/run.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/5.5/run.sh b/5.5/run.sh index 0ff6005..66df9ed 100644 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -31,7 +31,7 @@ CreateMySQLUser() StartMySQL #Setup DB - if ["$ON_CREATE_DB" = "**False**" ]; then + if [ "$ON_CREATE_DB" = "**False**" ]; then unset ON_CREATE_DB else echo "Creating MySQL database ${ON_CREATE_DB}" diff --git a/5.6/run.sh b/5.6/run.sh index 0ff6005..66df9ed 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -31,7 +31,7 @@ CreateMySQLUser() StartMySQL #Setup DB - if ["$ON_CREATE_DB" = "**False**" ]; then + if [ "$ON_CREATE_DB" = "**False**" ]; then unset ON_CREATE_DB else echo "Creating MySQL database ${ON_CREATE_DB}" From 37018186957ce798953aaf522cc4eaaf97172510 Mon Sep 17 00:00:00 2001 From: Richard Weber Date: Thu, 7 May 2015 21:31:01 +0300 Subject: [PATCH 27/44] If a database is being created, import SQL to it. If a user creates a database with the $ON_CREATE_DB environment variable and import SQL files those files will be imported into the created database. --- 5.5/run.sh | 6 +++++- 5.6/run.sh | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/5.5/run.sh b/5.5/run.sh index 66df9ed..dea8170 100644 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -71,7 +71,11 @@ ImportSql() for FILE in ${STARTUP_SQL}; do echo "=> Importing SQL file ${FILE}" - mysql -uroot < "${FILE}" + if [ "$ON_CREATE_DB" ]; then + mysql -uroot "$ON_CREATE_DB" < "${FILE}" + else + mysql -uroot < "${FILE}" + fi done mysqladmin -uroot shutdown diff --git a/5.6/run.sh b/5.6/run.sh index 66df9ed..db38257 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -71,7 +71,11 @@ ImportSql() for FILE in ${STARTUP_SQL}; do echo "=> Importing SQL file ${FILE}" - mysql -uroot < "${FILE}" + if [ "$ON_CREATE_DB" ]; then + mysql -uroot "$ON_CREATE_DB" < "${FILE}" + else + mysql -uroot < "${FILE}" + fi done mysqladmin -uroot shutdown From 0a554af5774078e9b3cbb2f01638e74e6475e3fc Mon Sep 17 00:00:00 2001 From: Richard Weber Date: Thu, 7 May 2015 21:48:32 +0300 Subject: [PATCH 28/44] Updated README to reflect changes to SQL importing --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c08b2c0..e5bde36 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,8 @@ that names the database. docker run -d -p 3306:3306 -e ON_CREATE_DB="database" tutum/mysql +If this is combined with importing SQL files, those files will be imported into the +created database. Mounting the database file volume --------------------------------- From 911de9ad0a1c18b8a19875b11ae2f14d9005548a Mon Sep 17 00:00:00 2001 From: Maxime Heckel Date: Tue, 12 May 2015 10:52:51 +0200 Subject: [PATCH 29/44] add tutum deploy button and tutum.yaml --- README.md | 2 ++ tutum.yaml | 0 2 files changed, 2 insertions(+) create mode 100644 tutum.yaml diff --git a/README.md b/README.md index c08b2c0..1cb5d9d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ tutum-docker-mysql ================== +[![Deploy to Tutum](https://s.tutum.co/deploy-to-tutum.svg)](https://dashboard.tutum.co/stack/deploy/) + Base docker image to run a MySQL database server diff --git a/tutum.yaml b/tutum.yaml new file mode 100644 index 0000000..e69de29 From f5fd797eef221a74b9dc7ee5074894bfdbce38c7 Mon Sep 17 00:00:00 2001 From: Maxime Heckel Date: Tue, 12 May 2015 10:55:40 +0200 Subject: [PATCH 30/44] Change tutum.yaml to tutum.yml --- tutum.yaml => tutum.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tutum.yaml => tutum.yml (100%) diff --git a/tutum.yaml b/tutum.yml similarity index 100% rename from tutum.yaml rename to tutum.yml From d678dbac953cabaa6fb0e0b5029d47814d57804d Mon Sep 17 00:00:00 2001 From: Maxime Heckel Date: Tue, 12 May 2015 10:57:12 +0200 Subject: [PATCH 31/44] update tutum.yml --- tutum.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tutum.yml b/tutum.yml index e69de29..ce0e974 100644 --- a/tutum.yml +++ b/tutum.yml @@ -0,0 +1,4 @@ +db: + image: tutum/mysql:5.5 + environment: + MYSQL_PASS: "**ChangeMe**" From 48cf17c9edae9482721292c565dceff94ff73b5f Mon Sep 17 00:00:00 2001 From: tifayuki Date: Thu, 18 Jun 2015 20:11:54 +0200 Subject: [PATCH 32/44] accelerate the startup of mysql --- 5.5/Dockerfile | 3 ++ 5.5/run.sh | 108 ++++++++++++++++++++++++++++--------------------- 5.6/Dockerfile | 3 ++ 5.6/run.sh | 108 ++++++++++++++++++++++++++++--------------------- circle.yml | 12 +++--- 5 files changed, 134 insertions(+), 100 deletions(-) diff --git a/5.5/Dockerfile b/5.5/Dockerfile index be72d95..b6e6b58 100644 --- a/5.5/Dockerfile +++ b/5.5/Dockerfile @@ -33,6 +33,9 @@ ENV REPLICATION_SLAVE **False** ENV REPLICATION_USER replica ENV REPLICATION_PASS replica +# ON_CREATE_SCRIPT +ENV ON_CREATE_DB **False** + # Add VOLUMEs to allow backup of config and databases VOLUME ["/etc/mysql", "/var/lib/mysql"] diff --git a/5.5/run.sh b/5.5/run.sh index 66df9ed..6ee098b 100644 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -1,5 +1,8 @@ #!/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" @@ -11,9 +14,8 @@ chmod 644 /etc/mysql/conf.d/mysqld_charset.cnf StartMySQL () { /usr/bin/mysqld_safe > /dev/null 2>&1 & - # Time out in 1 minute - LOOP_LIMIT=13 + LOOP_LIMIT=60 for (( i=0 ; ; i++ )); do if [ ${i} -eq ${LOOP_LIMIT} ]; then echo "Time out. Error log is shown as below:" @@ -21,23 +23,21 @@ StartMySQL () exit 1 fi echo "=> Waiting for confirmation of MySQL service startup, trying ${i}/${LOOP_LIMIT} ..." - sleep 5 + sleep 1 mysql -uroot -e "status" > /dev/null 2>&1 && break done } CreateMySQLUser() { - StartMySQL - - #Setup DB - 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 + #Setup DB + 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 if [ "$MYSQL_PASS" = "**Random**" ]; then unset MYSQL_PASS @@ -49,10 +49,7 @@ CreateMySQLUser() 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 "" @@ -61,20 +58,14 @@ CreateMySQLUser() 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 "========================================================================" - - mysqladmin -uroot shutdown } ImportSql() { - StartMySQL - for FILE in ${STARTUP_SQL}; do echo "=> Importing SQL file ${FILE}" mysql -uroot < "${FILE}" done - - mysqladmin -uroot shutdown } # Main @@ -86,6 +77,39 @@ if [ ${REPLICATION_SLAVE} == "**False**" ]; then unset REPLICATION_SLAVE 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 replicaiton 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 + # 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" @@ -96,11 +120,15 @@ if [[ ! -d $VOLUME_HOME/mysql ]]; then mysql_install_db > /dev/null 2>&1 echo "=> Done!" echo "=> Creating admin user ..." + StartMySQL CreateMySQLUser else echo "=> Using an existing volume of MySQL" + StartMySQL fi +tail -F $LOG & + # Import Startup SQL if [ -n "${STARTUP_SQL}" ]; then if [ ! -f /sql_imported ]; then @@ -110,44 +138,31 @@ if [ -n "${STARTUP_SQL}" ]; then fi fi - # Set MySQL REPLICATION - MASTER -if [ -n "${REPLICATION_MASTER}" ]; then - echo "=> Configuring MySQL replication as master ..." - if [ ! -f /replication_configured ]; 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} - echo "=> Starting MySQL ..." - StartMySQL +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!" - mysqladmin -uroot shutdown - touch /replication_configured + 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 ..." +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_configured ]; 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} - echo "=> Starting MySQL ..." - StartMySQL + 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!" - mysqladmin -uroot shutdown - touch /replication_configured + touch /replication_set.2 else echo "=> MySQL replicaiton slave already configured, skip" fi @@ -157,5 +172,4 @@ if [ -n "${REPLICATION_SLAVE}" ]; then fi fi -tail -F $LOG & -exec mysqld_safe +fg %1 diff --git a/5.6/Dockerfile b/5.6/Dockerfile index 32703cc..aeb67de 100644 --- a/5.6/Dockerfile +++ b/5.6/Dockerfile @@ -33,6 +33,9 @@ ENV REPLICATION_SLAVE **False** ENV REPLICATION_USER replica ENV REPLICATION_PASS replica +# ON_CREATE_SCRIPT +ENV ON_CREATE_DB **False** + # Add VOLUMEs to allow backup of config and databases VOLUME ["/etc/mysql", "/var/lib/mysql"] diff --git a/5.6/run.sh b/5.6/run.sh index 66df9ed..6ee098b 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -1,5 +1,8 @@ #!/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" @@ -11,9 +14,8 @@ chmod 644 /etc/mysql/conf.d/mysqld_charset.cnf StartMySQL () { /usr/bin/mysqld_safe > /dev/null 2>&1 & - # Time out in 1 minute - LOOP_LIMIT=13 + LOOP_LIMIT=60 for (( i=0 ; ; i++ )); do if [ ${i} -eq ${LOOP_LIMIT} ]; then echo "Time out. Error log is shown as below:" @@ -21,23 +23,21 @@ StartMySQL () exit 1 fi echo "=> Waiting for confirmation of MySQL service startup, trying ${i}/${LOOP_LIMIT} ..." - sleep 5 + sleep 1 mysql -uroot -e "status" > /dev/null 2>&1 && break done } CreateMySQLUser() { - StartMySQL - - #Setup DB - 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 + #Setup DB + 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 if [ "$MYSQL_PASS" = "**Random**" ]; then unset MYSQL_PASS @@ -49,10 +49,7 @@ CreateMySQLUser() 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 "" @@ -61,20 +58,14 @@ CreateMySQLUser() 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 "========================================================================" - - mysqladmin -uroot shutdown } ImportSql() { - StartMySQL - for FILE in ${STARTUP_SQL}; do echo "=> Importing SQL file ${FILE}" mysql -uroot < "${FILE}" done - - mysqladmin -uroot shutdown } # Main @@ -86,6 +77,39 @@ if [ ${REPLICATION_SLAVE} == "**False**" ]; then unset REPLICATION_SLAVE 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 replicaiton 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 + # 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" @@ -96,11 +120,15 @@ if [[ ! -d $VOLUME_HOME/mysql ]]; then mysql_install_db > /dev/null 2>&1 echo "=> Done!" echo "=> Creating admin user ..." + StartMySQL CreateMySQLUser else echo "=> Using an existing volume of MySQL" + StartMySQL fi +tail -F $LOG & + # Import Startup SQL if [ -n "${STARTUP_SQL}" ]; then if [ ! -f /sql_imported ]; then @@ -110,44 +138,31 @@ if [ -n "${STARTUP_SQL}" ]; then fi fi - # Set MySQL REPLICATION - MASTER -if [ -n "${REPLICATION_MASTER}" ]; then - echo "=> Configuring MySQL replication as master ..." - if [ ! -f /replication_configured ]; 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} - echo "=> Starting MySQL ..." - StartMySQL +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!" - mysqladmin -uroot shutdown - touch /replication_configured + 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 ..." +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_configured ]; 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} - echo "=> Starting MySQL ..." - StartMySQL + 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!" - mysqladmin -uroot shutdown - touch /replication_configured + touch /replication_set.2 else echo "=> MySQL replicaiton slave already configured, skip" fi @@ -157,5 +172,4 @@ if [ -n "${REPLICATION_SLAVE}" ]; then fi fi -tail -F $LOG & -exec mysqld_safe +fg %1 diff --git a/circle.yml b/circle.yml index 17287e6..2a40ce1 100644 --- a/circle.yml +++ b/circle.yml @@ -8,21 +8,21 @@ dependencies: test: override: # test mysql 5.5 - - docker run -d -p 13306:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" mysql-5.5; sleep 30 + - 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" # test mysql 5.6 - - docker run -d -p 13307:3306 -e MYSQL_USER="user" -e MYSQL_PASS="test" mysql-5.6; sleep 30 + - docker run -d -p 13307: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" # test replication 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 13308:3306 --name mysql55master mysql-5.5; sleep 30 - - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 13309:3306 --link mysql55master:mysql mysql-5.5; sleep 30 + - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_MASTER=true -e REPLICATION_USER=repl -e REPLICATION_PASS=repl -p 13308:3306 --name mysql55master mysql-5.5; sleep 10 + - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 13309:3306 --link mysql55master:mysql mysql-5.5; sleep 10 - docker logs mysql55master | grep "repl:repl" - mysql -uuser -ptest -h127.0.0.1 -P13308 -e "show master status\G;" | grep "mysql-bin.*" - mysql -uuser -ptest -h127.0.0.1 -P13309 -e "show slave status\G;" | grep "Slave_IO_Running.*Yes" - mysql -uuser -ptest -h127.0.0.1 -P13309 -e "show slave status\G;" | grep "Slave_SQL_Running.*Yes" # test replication 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 13310:3306 --name mysql56master mysql-5.6; sleep 30 - - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 13311:3306 --link mysql56master:mysql mysql-5.6; sleep 30 + - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_MASTER=true -e REPLICATION_USER=repl -e REPLICATION_PASS=repl -p 13310:3306 --name mysql56master mysql-5.6; sleep 10 + - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 13311:3306 --link mysql56master:mysql mysql-5.6; sleep 10 - docker logs mysql56master | grep "repl:repl" - mysql -uuser -ptest -h127.0.0.1 -P13310 -e "show master status\G;" | grep "mysql-bin.*" - mysql -uuser -ptest -h127.0.0.1 -P13311 -e "show slave status\G;" | grep "Slave_IO_Running.*Yes" From 034af6aff34c2a17a737bf0dd6ce30e8781368d9 Mon Sep 17 00:00:00 2001 From: Jeff Zellner Date: Sat, 4 Jul 2015 14:36:42 -0600 Subject: [PATCH 33/44] fix typos fix typos --- 5.5/run.sh | 8 ++++---- 5.6/run.sh | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/5.5/run.sh b/5.5/run.sh index 6ee098b..76b6b13 100644 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -102,7 +102,7 @@ if [ -n "${REPLICATION_SLAVE}" ]; then sed -i "s/^#log-bin.*/log-bin = mysql-bin/" ${CONF_FILE} touch /replication_set.1 else - echo "=> MySQL replicaiton slave already configured, skip" + echo "=> MySQL replication slave already configured, skip" fi else echo "=> Cannot configure slave, please link it to another MySQL container with alias as 'mysql'" @@ -139,7 +139,7 @@ if [ -n "${STARTUP_SQL}" ]; then fi # Set MySQL REPLICATION - MASTER -if [ -n "${REPLICATION_MASTER}" ]; then +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}" @@ -154,7 +154,7 @@ if [ -n "${REPLICATION_MASTER}" ]; then fi # Set MySQL REPLICATION - SLAVE -if [ -n "${REPLICATION_SLAVE}" ]; then +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 @@ -164,7 +164,7 @@ if [ -n "${REPLICATION_SLAVE}" ]; then echo "=> Done!" touch /replication_set.2 else - echo "=> MySQL replicaiton slave already configured, skip" + echo "=> MySQL replication slave already configured, skip" fi else echo "=> Cannot configure slave, please link it to another MySQL container with alias as 'mysql'" diff --git a/5.6/run.sh b/5.6/run.sh index 6ee098b..76b6b13 100644 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -102,7 +102,7 @@ if [ -n "${REPLICATION_SLAVE}" ]; then sed -i "s/^#log-bin.*/log-bin = mysql-bin/" ${CONF_FILE} touch /replication_set.1 else - echo "=> MySQL replicaiton slave already configured, skip" + echo "=> MySQL replication slave already configured, skip" fi else echo "=> Cannot configure slave, please link it to another MySQL container with alias as 'mysql'" @@ -139,7 +139,7 @@ if [ -n "${STARTUP_SQL}" ]; then fi # Set MySQL REPLICATION - MASTER -if [ -n "${REPLICATION_MASTER}" ]; then +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}" @@ -154,7 +154,7 @@ if [ -n "${REPLICATION_MASTER}" ]; then fi # Set MySQL REPLICATION - SLAVE -if [ -n "${REPLICATION_SLAVE}" ]; then +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 @@ -164,7 +164,7 @@ if [ -n "${REPLICATION_SLAVE}" ]; then echo "=> Done!" touch /replication_set.2 else - echo "=> MySQL replicaiton slave already configured, skip" + echo "=> MySQL replication slave already configured, skip" fi else echo "=> Cannot configure slave, please link it to another MySQL container with alias as 'mysql'" From a60d525a18787701d6a561b6f60f4bc30079035a Mon Sep 17 00:00:00 2001 From: tifayuki Date: Mon, 6 Jul 2015 21:03:42 +0200 Subject: [PATCH 34/44] move install_db to Dockerfile --- 5.5/Dockerfile | 42 +++++++++++++-------------------- 5.5/import_sql.sh | 0 5.5/run.sh | 60 ++++++++++++++++++++++++++++------------------- 5.6/Dockerfile | 42 +++++++++++++-------------------- 5.6/import_sql.sh | 0 5.6/run.sh | 60 ++++++++++++++++++++++++++++------------------- 6 files changed, 104 insertions(+), 100 deletions(-) mode change 100644 => 100755 5.5/import_sql.sh mode change 100644 => 100755 5.5/run.sh mode change 100644 => 100755 5.6/import_sql.sh mode change 100644 => 100755 5.6/run.sh diff --git a/5.5/Dockerfile b/5.5/Dockerfile index b6e6b58..17be0cd 100644 --- a/5.5/Dockerfile +++ b/5.5/Dockerfile @@ -1,40 +1,30 @@ FROM ubuntu:trusty MAINTAINER Fernando Mayo , Feng Honglin -# Install packages -ENV DEBIAN_FRONTEND noninteractive -RUN apt-get update && \ - apt-get -yq install mysql-server-5.5 pwgen && \ - rm -rf /var/lib/apt/lists/* - -# Remove pre-installed database -RUN rm -rf /var/lib/mysql/* - -# Remove syslog configuration -RUN rm /etc/mysql/conf.d/mysqld_safe_syslog.cnf - # Add MySQL configuration ADD my.cnf /etc/mysql/conf.d/my.cnf ADD mysqld_charset.cnf /etc/mysql/conf.d/mysqld_charset.cnf +RUN apt-get update && \ + apt-get -yq install mysql-server-5.5 pwgen && \ + rm -rf /var/lib/apt/lists/* && \ + rm /etc/mysql/conf.d/mysqld_safe_syslog.cnf && \ + if [ ! -f /usr/share/mysql/my-default.cnf ] ; then cp /etc/mysql/my.cnf /usr/share/mysql/my-default.cnf; fi && \ + mysql_install_db > /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 -RUN chmod 755 /*.sh - -# Exposed ENV -ENV MYSQL_USER admin -ENV MYSQL_PASS **Random** -ENV ON_CREATE_DB **False** - -# Replication ENV -ENV REPLICATION_MASTER **False** -ENV REPLICATION_SLAVE **False** -ENV REPLICATION_USER replica -ENV REPLICATION_PASS replica -# ON_CREATE_SCRIPT -ENV ON_CREATE_DB **False** +ENV MYSQL_USER=admin \ + MYSQL_PASS=**Random** \ + ON_CREATE_DB=**False** \ + REPLICATION_MASTER=**False** \ + REPLICATION_SLAVE=**False** \ + REPLICATION_USER=replica \ + REPLICATION_PASS=replica \ + ON_CREATE_DB=**False** # Add VOLUMEs to allow backup of config and databases VOLUME ["/etc/mysql", "/var/lib/mysql"] diff --git a/5.5/import_sql.sh b/5.5/import_sql.sh old mode 100644 new mode 100755 diff --git a/5.5/run.sh b/5.5/run.sh old mode 100644 new mode 100755 index 76b6b13..fcc5e78 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -30,15 +30,6 @@ StartMySQL () CreateMySQLUser() { - #Setup DB - 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 - if [ "$MYSQL_PASS" = "**Random**" ]; then unset MYSQL_PASS fi @@ -60,6 +51,18 @@ CreateMySQLUser() 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 @@ -77,6 +80,20 @@ 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) ..." @@ -110,24 +127,19 @@ if [ -n "${REPLICATION_SLAVE}" ]; then fi 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 > /dev/null 2>&1 - echo "=> Done!" + +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 ..." - StartMySQL CreateMySQLUser -else - echo "=> Using an existing volume of MySQL" - StartMySQL + OnCreateDB + rm /var/lib/mysql/.EMPTY_DB fi -tail -F $LOG & # Import Startup SQL if [ -n "${STARTUP_SQL}" ]; then @@ -172,4 +184,4 @@ if [ -n "${REPLICATION_SLAVE}" ]; then fi fi -fg %1 +fg diff --git a/5.6/Dockerfile b/5.6/Dockerfile index aeb67de..e4f0ba6 100644 --- a/5.6/Dockerfile +++ b/5.6/Dockerfile @@ -1,40 +1,30 @@ FROM ubuntu:trusty MAINTAINER Fernando Mayo , Feng Honglin -# Install packages -ENV DEBIAN_FRONTEND noninteractive -RUN apt-get update && \ - apt-get -yq install mysql-server-5.6 pwgen && \ - rm -rf /var/lib/apt/lists/* - -# Remove pre-installed database -RUN rm -rf /var/lib/mysql/* - -# Remove syslog configuration -RUN rm /etc/mysql/conf.d/mysqld_safe_syslog.cnf - # Add MySQL configuration ADD my.cnf /etc/mysql/conf.d/my.cnf ADD mysqld_charset.cnf /etc/mysql/conf.d/mysqld_charset.cnf +RUN apt-get update && \ + apt-get -yq install mysql-server-5.6 pwgen && \ + rm -rf /var/lib/apt/lists/* && \ + rm /etc/mysql/conf.d/mysqld_safe_syslog.cnf && \ + if [ ! -f /usr/share/mysql/my-default.cnf ] ; then cp /etc/mysql/my.cnf /usr/share/mysql/my-default.cnf; fi && \ + mysql_install_db > /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 -RUN chmod 755 /*.sh - -# Exposed ENV -ENV MYSQL_USER admin -ENV MYSQL_PASS **Random** -ENV ON_CREATE_DB **False** - -# Replication ENV -ENV REPLICATION_MASTER **False** -ENV REPLICATION_SLAVE **False** -ENV REPLICATION_USER replica -ENV REPLICATION_PASS replica -# ON_CREATE_SCRIPT -ENV ON_CREATE_DB **False** +ENV MYSQL_USER=admin \ + MYSQL_PASS=**Random** \ + ON_CREATE_DB=**False** \ + REPLICATION_MASTER=**False** \ + REPLICATION_SLAVE=**False** \ + REPLICATION_USER=replica \ + REPLICATION_PASS=replica \ + ON_CREATE_DB=**False** # Add VOLUMEs to allow backup of config and databases VOLUME ["/etc/mysql", "/var/lib/mysql"] diff --git a/5.6/import_sql.sh b/5.6/import_sql.sh old mode 100644 new mode 100755 diff --git a/5.6/run.sh b/5.6/run.sh old mode 100644 new mode 100755 index 76b6b13..fcc5e78 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -30,15 +30,6 @@ StartMySQL () CreateMySQLUser() { - #Setup DB - 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 - if [ "$MYSQL_PASS" = "**Random**" ]; then unset MYSQL_PASS fi @@ -60,6 +51,18 @@ CreateMySQLUser() 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 @@ -77,6 +80,20 @@ 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) ..." @@ -110,24 +127,19 @@ if [ -n "${REPLICATION_SLAVE}" ]; then fi 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 > /dev/null 2>&1 - echo "=> Done!" + +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 ..." - StartMySQL CreateMySQLUser -else - echo "=> Using an existing volume of MySQL" - StartMySQL + OnCreateDB + rm /var/lib/mysql/.EMPTY_DB fi -tail -F $LOG & # Import Startup SQL if [ -n "${STARTUP_SQL}" ]; then @@ -172,4 +184,4 @@ if [ -n "${REPLICATION_SLAVE}" ]; then fi fi -fg %1 +fg From b41088dd3cf81b21d57bceab0012fec5cbe091b6 Mon Sep 17 00:00:00 2001 From: tifayuki Date: Tue, 7 Jul 2015 16:47:28 +0200 Subject: [PATCH 35/44] update tests with host volume --- test.sh | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100755 test.sh diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..745ed01 --- /dev/null +++ b/test.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +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 avolume 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" From 9279b677490026b69f25ed5ba2ab3885816fef54 Mon Sep 17 00:00:00 2001 From: tifayuki Date: Tue, 7 Jul 2015 17:04:57 +0200 Subject: [PATCH 36/44] remove circle.yml --- circle.yml | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 circle.yml diff --git a/circle.yml b/circle.yml deleted file mode 100644 index 2a40ce1..0000000 --- a/circle.yml +++ /dev/null @@ -1,29 +0,0 @@ -machine: - services: - - docker -dependencies: - override: - - docker build -t mysql-5.5 5.5/ - - docker build -t mysql-5.6 5.6/ -test: - override: - # test mysql 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" - # test mysql 5.6 - - docker run -d -p 13307: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" - # test replication 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 13308:3306 --name mysql55master mysql-5.5; sleep 10 - - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 13309:3306 --link mysql55master:mysql mysql-5.5; sleep 10 - - docker logs mysql55master | grep "repl:repl" - - mysql -uuser -ptest -h127.0.0.1 -P13308 -e "show master status\G;" | grep "mysql-bin.*" - - mysql -uuser -ptest -h127.0.0.1 -P13309 -e "show slave status\G;" | grep "Slave_IO_Running.*Yes" - - mysql -uuser -ptest -h127.0.0.1 -P13309 -e "show slave status\G;" | grep "Slave_SQL_Running.*Yes" - # test replication 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 13310:3306 --name mysql56master mysql-5.6; sleep 10 - - docker run -d -e MYSQL_USER=user -e MYSQL_PASS=test -e REPLICATION_SLAVE=true -p 13311:3306 --link mysql56master:mysql mysql-5.6; sleep 10 - - docker logs mysql56master | grep "repl:repl" - - mysql -uuser -ptest -h127.0.0.1 -P13310 -e "show master status\G;" | grep "mysql-bin.*" - - mysql -uuser -ptest -h127.0.0.1 -P13311 -e "show slave status\G;" | grep "Slave_IO_Running.*Yes" - - mysql -uuser -ptest -h127.0.0.1 -P13311 -e "show slave status\G;" | grep "Slave_SQL_Running.*Yes" From 78c55b6651702143b732031d6109c527f1c19da9 Mon Sep 17 00:00:00 2001 From: tifayuki Date: Fri, 17 Jul 2015 17:40:29 +0200 Subject: [PATCH 37/44] fix #71 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1cb5d9d..9a894e0 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ Creating a database on container creation ------------------------------------------------- If you want a database to be created inside the container when you start it up -for the first time you can set the environment variable `MYSQL_DB` to string +for the first time you can set the environment variable `ON_MYSQL_DB` to a string that names the database. docker run -d -p 3306:3306 -e ON_CREATE_DB="database" tutum/mysql From c5135fdf63935aaaf735aa0d56859ba21f04795a Mon Sep 17 00:00:00 2001 From: Kevin Murphy Date: Fri, 17 Jul 2015 11:44:04 -0400 Subject: [PATCH 38/44] Fix typo to clarify ON_CREATE_DB instructions --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9a894e0..f897039 100644 --- a/README.md +++ b/README.md @@ -71,10 +71,10 @@ Creating a database on container creation ------------------------------------------------- If you want a database to be created inside the container when you start it up -for the first time you can set the environment variable `ON_MYSQL_DB` to a string +for the first time you can set the environment variable `ON_CREATE_DB` to a string that names the database. - docker run -d -p 3306:3306 -e ON_CREATE_DB="database" tutum/mysql + docker run -d -p 3306:3306 -e ON_CREATE_DB="newdatabase" tutum/mysql Mounting the database file volume From e6b18c51fd41100b9320ca1b72c9170021633c5c Mon Sep 17 00:00:00 2001 From: Erin Dachtler Date: Thu, 23 Jul 2015 13:44:06 -0700 Subject: [PATCH 39/44] Removed redundant ON_CREATE_DB ENV line --- 5.6/Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/5.6/Dockerfile b/5.6/Dockerfile index e4f0ba6..29bf276 100644 --- a/5.6/Dockerfile +++ b/5.6/Dockerfile @@ -23,8 +23,7 @@ ENV MYSQL_USER=admin \ REPLICATION_MASTER=**False** \ REPLICATION_SLAVE=**False** \ REPLICATION_USER=replica \ - REPLICATION_PASS=replica \ - ON_CREATE_DB=**False** + REPLICATION_PASS=replica # Add VOLUMEs to allow backup of config and databases VOLUME ["/etc/mysql", "/var/lib/mysql"] From 22533fd9ebd6999d5b7e1fb9e458d92d9c3c54be Mon Sep 17 00:00:00 2001 From: fermayo Date: Thu, 30 Jul 2015 22:55:37 +0200 Subject: [PATCH 40/44] updated docker-compose files --- tutum.yml => 5.5/docker-compose.yml | 0 5.6/docker-compose.yml | 4 ++++ docker-compose.yml | 4 ++++ 3 files changed, 8 insertions(+) rename tutum.yml => 5.5/docker-compose.yml (100%) create mode 100644 5.6/docker-compose.yml create mode 100644 docker-compose.yml diff --git a/tutum.yml b/5.5/docker-compose.yml similarity index 100% rename from tutum.yml rename to 5.5/docker-compose.yml diff --git a/5.6/docker-compose.yml b/5.6/docker-compose.yml new file mode 100644 index 0000000..6854cd1 --- /dev/null +++ b/5.6/docker-compose.yml @@ -0,0 +1,4 @@ +db: + image: tutum/mysql:5.6 + environment: + MYSQL_PASS: "**ChangeMe**" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..bd56e19 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,4 @@ +db: + image: tutum/mysql:latest + environment: + MYSQL_PASS: "**ChangeMe**" From 4b77d14260c7898574c62b079b16dc6bbbc9a033 Mon Sep 17 00:00:00 2001 From: tifayuki Date: Tue, 18 Aug 2015 15:16:04 +0200 Subject: [PATCH 41/44] add EXTRA_OPTS to pass additional settings to start mysql --- 5.5/run.sh | 19 +++++++++---------- 5.6/run.sh | 19 +++++++++---------- README.md | 7 +++++++ 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/5.5/run.sh b/5.5/run.sh index 5ab10d4..8e758ce 100755 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -13,7 +13,7 @@ chmod 644 /etc/mysql/conf.d/mysqld_charset.cnf StartMySQL () { - /usr/bin/mysqld_safe > /dev/null 2>&1 & + /usr/bin/mysqld_safe ${EXTRA_OPTS} > /dev/null 2>&1 & # Time out in 1 minute LOOP_LIMIT=60 for (( i=0 ; ; i++ )); do @@ -60,19 +60,18 @@ OnCreateDB() 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 + 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 diff --git a/5.6/run.sh b/5.6/run.sh index 2c99469..8e758ce 100755 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -13,7 +13,7 @@ chmod 644 /etc/mysql/conf.d/mysqld_charset.cnf StartMySQL () { - /usr/bin/mysqld_safe > /dev/null 2>&1 & + /usr/bin/mysqld_safe ${EXTRA_OPTS} > /dev/null 2>&1 & # Time out in 1 minute LOOP_LIMIT=60 for (( i=0 ; ; i++ )); do @@ -60,19 +60,18 @@ OnCreateDB() 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 + 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 diff --git a/README.md b/README.md index fea12eb..6643f81 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,13 @@ You can now test your deployment: Done! +Passing extra configuration to start mysql server +------------------------------------------------ + +To pass additional settings to `mysqld`, you can use environment variable `EXTRA_OPTS`. +For example, to run mysql using lower case table name, you can do: + + docker run -d -p 3306:3306 -e EXTRA_OPTS="--lower_case_table_names=1" tutum/mysql Setting a specific password for the admin account ------------------------------------------------- From 7156620df336e0ef9468607c5194e2ac91c767d1 Mon Sep 17 00:00:00 2001 From: Alex McRoberts Date: Mon, 21 Sep 2015 11:15:25 -0700 Subject: [PATCH 42/44] Fixing typo --- test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test.sh b/test.sh index 745ed01..b7fdfe5 100755 --- a/test.sh +++ b/test.sh @@ -17,7 +17,7 @@ mysql -uuser -ptest -h127.0.0.1 -P13307 -e "show master status\G;" | grep "mysql 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 avolume on mysql 5.5" +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" From 931e5316aaf453e72c44d7e6231f3935276191bd Mon Sep 17 00:00:00 2001 From: lexicalunit Date: Tue, 26 Jan 2016 10:05:06 -0600 Subject: [PATCH 43/44] Improvements to shell and Dockerfile scripts. - `test.sh`: Adds quotes to prevent word splitting. - `5.*/Dockerfile`: Prefer `COPY` over `ADD`. See: https://docs.docker.com/engine/articles/dockerfile_best-practices/ - `5.*/import_sql.sh`: Adds missing $. I admit I don't know why it works without the $ there, but it's unnerving, and shellcheck complains that "This expression is constant. Did you forget the $ on a variable?" - Some scripts have a mixture of tabs and spaces for indention. Spaces are the more common style. Untabifies those scripts. --- 5.5/Dockerfile | 8 ++++---- 5.5/import_sql.sh | 6 +++--- 5.5/run.sh | 40 ++++++++++++++++++++-------------------- 5.6/Dockerfile | 8 ++++---- 5.6/import_sql.sh | 8 ++++---- 5.6/run.sh | 40 ++++++++++++++++++++-------------------- test.sh | 8 ++++---- 7 files changed, 59 insertions(+), 59 deletions(-) diff --git a/5.5/Dockerfile b/5.5/Dockerfile index 17be0cd..a02b055 100644 --- a/5.5/Dockerfile +++ b/5.5/Dockerfile @@ -2,8 +2,8 @@ FROM ubuntu:trusty MAINTAINER Fernando Mayo , Feng Honglin # Add MySQL configuration -ADD my.cnf /etc/mysql/conf.d/my.cnf -ADD mysqld_charset.cnf /etc/mysql/conf.d/mysqld_charset.cnf +COPY my.cnf /etc/mysql/conf.d/my.cnf +COPY mysqld_charset.cnf /etc/mysql/conf.d/mysqld_charset.cnf RUN apt-get update && \ apt-get -yq install mysql-server-5.5 pwgen && \ @@ -14,8 +14,8 @@ RUN apt-get update && \ touch /var/lib/mysql/.EMPTY_DB # Add MySQL scripts -ADD import_sql.sh /import_sql.sh -ADD run.sh /run.sh +COPY import_sql.sh /import_sql.sh +COPY run.sh /run.sh ENV MYSQL_USER=admin \ MYSQL_PASS=**Random** \ diff --git a/5.5/import_sql.sh b/5.5/import_sql.sh index 995e6c9..975d021 100755 --- a/5.5/import_sql.sh +++ b/5.5/import_sql.sh @@ -1,8 +1,8 @@ #!/bin/bash if [[ $# -ne 3 ]]; then - echo "Usage: $0 " - exit 1 + echo "Usage: $0 " + exit 1 fi echo "=> Starting MySQL Server" @@ -14,7 +14,7 @@ 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=$? + RET=$? done echo " Started with PID ${PID}" diff --git a/5.5/run.sh b/5.5/run.sh index 8e758ce..f529780 100755 --- a/5.5/run.sh +++ b/5.5/run.sh @@ -30,25 +30,25 @@ StartMySQL () 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 -P" - 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 "========================================================================" + 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 -P" + 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() @@ -65,7 +65,7 @@ OnCreateDB() ImportSql() { for FILE in ${STARTUP_SQL}; do - echo "=> Importing SQL file ${FILE}" + echo "=> Importing SQL file ${FILE}" if [ "$ON_CREATE_DB" ]; then mysql -uroot "$ON_CREATE_DB" < "${FILE}" else diff --git a/5.6/Dockerfile b/5.6/Dockerfile index 29bf276..7784afe 100644 --- a/5.6/Dockerfile +++ b/5.6/Dockerfile @@ -2,8 +2,8 @@ FROM ubuntu:trusty MAINTAINER Fernando Mayo , Feng Honglin # Add MySQL configuration -ADD my.cnf /etc/mysql/conf.d/my.cnf -ADD mysqld_charset.cnf /etc/mysql/conf.d/mysqld_charset.cnf +COPY my.cnf /etc/mysql/conf.d/my.cnf +COPY mysqld_charset.cnf /etc/mysql/conf.d/mysqld_charset.cnf RUN apt-get update && \ apt-get -yq install mysql-server-5.6 pwgen && \ @@ -14,8 +14,8 @@ RUN apt-get update && \ touch /var/lib/mysql/.EMPTY_DB # Add MySQL scripts -ADD import_sql.sh /import_sql.sh -ADD run.sh /run.sh +COPY import_sql.sh /import_sql.sh +COPY run.sh /run.sh ENV MYSQL_USER=admin \ MYSQL_PASS=**Random** \ diff --git a/5.6/import_sql.sh b/5.6/import_sql.sh index 995e6c9..f21b4f9 100755 --- a/5.6/import_sql.sh +++ b/5.6/import_sql.sh @@ -1,8 +1,8 @@ #!/bin/bash if [[ $# -ne 3 ]]; then - echo "Usage: $0 " - exit 1 + echo "Usage: $0 " + exit 1 fi echo "=> Starting MySQL Server" @@ -10,11 +10,11 @@ echo "=> Starting MySQL Server" PID=$! RET=1 -while [[ RET -ne 0 ]]; do +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=$? + RET=$? done echo " Started with PID ${PID}" diff --git a/5.6/run.sh b/5.6/run.sh index 8e758ce..f529780 100755 --- a/5.6/run.sh +++ b/5.6/run.sh @@ -30,25 +30,25 @@ StartMySQL () 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 -P" - 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 "========================================================================" + 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 -P" + 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() @@ -65,7 +65,7 @@ OnCreateDB() ImportSql() { for FILE in ${STARTUP_SQL}; do - echo "=> Importing SQL file ${FILE}" + echo "=> Importing SQL file ${FILE}" if [ "$ON_CREATE_DB" ]; then mysql -uroot "$ON_CREATE_DB" < "${FILE}" else diff --git a/test.sh b/test.sh index b7fdfe5..8426141 100755 --- a/test.sh +++ b/test.sh @@ -19,10 +19,10 @@ mysql -uuser -ptest -h127.0.0.1 -P13308 -e "show slave status\G;" | grep "Slave_ 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 +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 +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" @@ -42,10 +42,10 @@ mysql -uuser -ptest -h127.0.0.1 -P23308 -e "show slave status\G;" | grep "Slave_ 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 +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 +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" From add1cff4b9555b89a08963f724107914566a6e26 Mon Sep 17 00:00:00 2001 From: Feng Honglin Date: Thu, 17 Mar 2016 15:29:45 +0100 Subject: [PATCH 44/44] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6643f81..b12cb8b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ tutum-docker-mysql ================== +**This image will be deprecated soon. Please use the docker official image:** https://hub.docker.com/_/mysql/ + [![Deploy to Tutum](https://s.tutum.co/deploy-to-tutum.svg)](https://dashboard.tutum.co/stack/deploy/) Base docker image to run a MySQL database server