将/ var / lib / mysql挂载到本地主机卷时,Mysql不会在docker容器中启动

时间:2017-08-24 07:35:59

标签: docker

我有以下Dockerfile来创建一个运行的容器,NGINX& MYSQL。我正在尝试将/ var / lib / mysql挂载到本地Docker主机,以便在容器被销毁后保留MySQL数据库。

    FROM ubuntu:16.04
    MAINTAINER - ******


    ## Install php nginx mysql supervisor ###
    ########################################
    RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
        php-fpm \
        php-cli \
        php-gd  \
        php-mcrypt \
        php-mysql \
        php-curl \
        php-xml \
        php-json \
        nginx \
        curl \
        unzip \
        mysql-server \
        supervisor


    ### Nginx  & PHP-FPM ###
    ########################


    # Remove the default Nginx configuration file
    RUN rm -v /etc/nginx/nginx.conf

    # Copy configuration files from the current directory
    ADD files/nginx.conf /etc/nginx/nginx.conf
    ADD files/php-fpm.conf /etc/php/7.0/fpm/


    ### MYSQL ###
    ############
    ENV ROOT_PWD test

    ### Supervisor.conf ###
######################
ADD files/supervisord.conf /etc/supervisor/supervisord.conf


### Container configuration ###
###############################

EXPOSE 80
VOLUME /DATA
VOLUME /var/lib/mysql

# Set the default command to execute
# when creating a new container
ADD start.sh /
RUN chmod u+x /start.sh
CMD /start.sh

以下是我的入口点脚本start.sh:

#!/bin/sh


# 1.MYSQL SETUP 
#
# ###########

MYSQL_CHARSET=${MYSQL_CHARSET:-"utf8"}
MYSQL_COLLATION=${MYSQL_COLLATION:-"utf8_unicode_ci"}

create_data_dir() {
  mkdir -p /var/lib/mysql
  chmod -R 0700 /var/lib/mysql
  chown -R mysql:mysql /var/lib/mysql
}

create_run_dir() {
  mkdir -p /run/mysqld
  chmod -R 0755 /run/mysqld
  chown -R mysql:root /run/mysqld
}

create_log_dir() {
  mkdir -p /var/log/mysql
  chmod -R 0755 /var/log/mysql
  chown -R mysql:mysql /var/log/mysql
}

mysql_default_install() {
    /usr/bin/mysql_install_db --datadir=/var/lib/mysql
}

create_modx_database() {
   # start mysql server.
    /usr/bin/mysqld_safe >/dev/null 2>&1 &

   # wait for mysql server to start (max 30 seconds).
    timeout=30
    echo -n "Waiting for database server to accept connections"
    while ! /usr/bin/mysqladmin -u root status >/dev/null 2>&1
    do
      timeout=$(($timeout - 1))
      if [ $timeout -eq 0 ]; then
        echo -e "\nCould not connect to database server. Aborting..."
        exit 1
      fi
      echo -n "."
      sleep 1
    done
    echo

    # create database and assign user permissions.
    if [ -n "${DB_NAME}" -a -n "${DB_USER}" -a -n "${DB_PASS}" ]; then
       echo "Creating database \"${DB_NAME}\" and granting access to \"${DB_USER}\" database."
        mysql -uroot  -e  "CREATE DATABASE ${DB_NAME};"
        mysql -uroot  -e  "GRANT USAGE ON *.* TO ${DB_USER}@localhost IDENTIFIED BY '${DB_PASS}';"
        mysql -uroot  -e  "GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO ${DB_USER}@localhost;"

    fi 

}

set_mysql_root_pw() {
    # set root password for mysql.
    echo "Setting root password"
    /usr/bin/mysqladmin -u root password "${ROOT_PWD}"

    # shutdown mysql reeady for supervisor to start mysql.
    /usr/bin/mysqladmin -u root --password=${ROOT_PWD} shutdown
}


# 2.NGINX & PHP-FPM 
#
# ################

create_www_dir() {
  # Create LOG directoties for NGINX & PHP-FPM
  echo "Creating www directories"
  mkdir -p /DATA/logs/php-fpm
  mkdir -p /DATA/logs/nginx
  mkdir -p /DATA/www

}

apply_www_permissions(){
  echo "Applying www permissions"
  chown -R www-data:www-data /DATA/www /DATA/logs

}



# Running all script functions
create_data_dir
create_run_dir
create_log_dir
mysql_default_install
create_modx_database
set_mysql_root_pw
create_www_dir
apply_www_permissions

# Start Supervisor 
echo "Starting Supervisor"
/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf

我可以成功运行容器而无需使用以下命令将/ var / lib / mysql文件夹挂载到本地docker主机:

docker run  --name modx.test --expose 80  -d -e 'VIRTUAL_HOST=modx.test' -e 'DB_NAME=modx' -e 'DB_USER=modx' -e 'DB_PASS=test' -v /data/sites/test:/DATA  modx

如果我尝试使用以下命令挂载/ var / lib / mysql:

docker run  --name modx.test --expose 80  -d -e 'VIRTUAL_HOST=modx.test' -e 'DB_NAME=modx' -e 'DB_USER=modx' -e 'DB_PASS=test' -v /data/sites/test:/DATA  -v /data/sites/test/mysql:/var/lib/mysql modx

发生以下错误:2017-08-24 07:47:22 [ERROR] The data directory '/var/lib/mysql' already exist and is not empty. Waiting for database server to accept connections.............................-e Could not connect to database server. Aborting...

1 个答案:

答案 0 :(得分:0)

管理以解决问题。通过使用/usr/sbin/mysqld --initialize-insecure --datadir=/var/lib/mysql,还可以添加一个IF子句来检查是否已经创建了初始数据库。

mysql_default_install() {
  if [ ! -d "/var/lib/mysql/mysql" ]; then
      echo "Creating the default database"
      /usr/sbin/mysqld --initialize-insecure --datadir=/var/lib/mysql

  else
      echo "MySQL database already initialiazed"
  fi
}