Docker.Service.Server.MySQL.js

JavaScript source for A Docker module for Node.js, 72 lines. Raw file

const Security = require('Security');
const fs = require('fs')

const Docker =
{
    Service:
    {
        Start: require('./../Docker.Service.Start'),

        Server:
        {
            MySQL: ( serviceName, dataDirectory, databaseName, username, password, port ) =>
            {
                serviceName = Security.String(serviceName)
                dataDirectory = Security.String(dataDirectory)
                databaseName = Security.String(databaseName)
                username = Security.String(username)
                password = Security.String(password)
                port = Security.Integer(port)  //  min: 1


                const dataDirectoryAtomized = dataDirectory.split("/")
                let basePath = "";
                dataDirectoryAtomized.forEach( dir => {
                    basePath += "/"+dir;
                    if (!fs.existsSync(basePath)) {
                        fs.mkdirSync(basePath)
                    }
                })

                const dockerfileContent = [
                    `FROM ubuntu:latest`,
                    `USER root`,
                    `ENV LANG=C.UTF-8`,
                    `ENV DEBIAN_FRONTEND=noninteractive`,
                    `ENV TZ=Europe`,
                    `ENV PHP_IDE_CONFIG="serverName=localhost"`,
                    `WORKDIR /tmp`,
                    `RUN apt-get update`,
                    `RUN apt-get install -y mysql-server`,
                    `RUN sed -i "s/bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/mysql.conf.d/mysqld.cnf`,
                    `RUN echo "lower_case_table_names = 1" >> /etc/mysql/mysql.conf.d/mysqld.cnf`,
                    //  Raised from the MySQL default (151). Persistent PDO connections are held
                    //  one per FPM/Apache worker, so the connection count tracks worker counts;
                    //  this gives comfortable headroom. Only actually-open connections cost memory.
                    `RUN echo "max_connections = 500" >> /etc/mysql/mysql.conf.d/mysqld.cnf`,
                    `RUN usermod -d /var/lib/mysql/ mysql`,
                    `RUN echo "FLUSH PRIVILEGES;" >> /tmp/my.sql`,
                    `RUN echo "ALTER USER 'root'@'localhost' IDENTIFIED BY '';" >> /tmp/my.sql`,
                    `RUN echo "CREATE DATABASE ${databaseName};" >> /tmp/my.sql`,
                    `RUN echo "CREATE USER '${username}'@'%' IDENTIFIED BY '${password}';" >> /tmp/my.sql`,
                    `RUN echo "GRANT ALL PRIVILEGES ON *.* TO '${username}'@'%';" >> /tmp/my.sql`,
                    `RUN echo "#! /bin/bash" >> /root/start.sh`,
                    `RUN echo "mysqld --initialize --lower_case_table_names=1 --user=mysql --console" >> /root/start.sh`,
                    `RUN echo "mysqld --init-file=/tmp/my.sql" >> /root/start.sh`,
                    `RUN echo "tail -f /dev/null" >> /root/start.sh`,
                    `RUN chmod 777 /root/start.sh`,
                    `CMD /root/start.sh`
                ].join(`\n`)

                const args = [
                    `-p${port}:3306`,
                    `-v"${dataDirectory}":"/var/lib/mysql"`,
                ];

                return Docker.Service.Start( serviceName, dockerfileContent, __dirname, args )
            }
        }
    }
}

module.exports = Docker.Service.Server.MySQL