├── .gitignore ├── LICENSE ├── README.md ├── entry.sh └── Dockerfile /.gitignore: -------------------------------------------------------------------------------- 1 | .history/ 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Juan Cuzmar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Docker with LAMP stack based on Alpine Linux 2 | 3 | This docker contain a LAMP stack installed from scratch 4 | 5 | ## Installation 6 | ### Grab from docker hub 7 | ``` 8 | docker run -d -v /path/to/project:/var/www/localhost/htdocs/ -v /path/to/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -p 80:80 -p 3306:3306 --name lamp j1cs/alpine-lamp 9 | ``` 10 | 11 | ### Run you own image 12 | 13 | ``` 14 | git clone https://github.com/j1cs/alpine-lamp && cd alpine-lamp/ 15 | ``` 16 | 17 | ### Build the image 18 | ``` 19 | docker build -t $USER/alpine-lamp . 20 | ``` 21 | 22 | ### Run it 23 | 24 | ``` 25 | docker run -d -v /path/to/project:/var/www/localhost/htdocs/ -e MYSQL_ROOT_PASSWORD=password -p 80:80 -p 3306:3306 --name lamp $USER/alpine-lamp 26 | ``` 27 | 28 | ### Connect to MariaDB 29 | To use this you need to install mysql/mariadb cli client 30 | ``` 31 | mysql -uroot -ppassword -h 127.0.0.1 32 | ``` 33 | 34 | ### PhpMyAdmin 35 | 36 | If you want to use phpMyAdmin use the branch called: **phpmyadmin-feature** 37 | 38 | 39 | ## Troubleshooting 40 | 41 | ### Forbidden error 403 42 | ``` 43 | sudo chmod -Rf 755 /path/to/project 44 | ``` 45 | 46 | ### Error activating InnoDB 47 | If you get errors about activating InnoDB and you are on Windows or Mac, you 48 | may be encountering [this 49 | issue](https://github.com/docker-library/mariadb/issues/95) with using 50 | host-mapped volumes for MariaDB. Work-around is to use a named volume 51 | (persistent but not mapped), or [add/overwrite mysql config](https://github.com/docker-library/mariadb/issues/95#issuecomment-391587301) before entry. 52 | 53 | ### Missing libs 54 | Please let me know or create a pull request 55 | 56 | ## Repos 57 | https://hub.docker.com/r/j1cs/alpine-lamp 58 | https://github.com/j1cs/alpine-lamp 59 | -------------------------------------------------------------------------------- /entry.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # start apache 4 | echo "Starting httpd" 5 | httpd 6 | echo "Done httpd" 7 | 8 | 9 | # check if mysql data directory is nuked 10 | # if so, install the db 11 | echo "Checking /var/lib/mysql folder" 12 | if [ ! -f /var/lib/mysql/ibdata1 ]; then 13 | echo "Installing db" 14 | mariadb-install-db --user=mysql --ldata=/var/lib/mysql > /dev/null 15 | echo "Installed" 16 | fi; 17 | 18 | # from mysql official docker repo 19 | if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then 20 | echo >&2 'error: database is uninitialized and password option is not specified ' 21 | echo >&2 ' You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_RANDOM_ROOT_PASSWORD' 22 | exit 1 23 | fi 24 | 25 | # random password 26 | if [ ! -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then 27 | echo "Using random password" 28 | MYSQL_ROOT_PASSWORD="$(pwgen -1 32)" 29 | echo "GENERATED ROOT PASSWORD: $MYSQL_ROOT_PASSWORD" 30 | echo "Done" 31 | fi 32 | 33 | tfile=`mktemp` 34 | if [ ! -f "$tfile" ]; then 35 | return 1 36 | fi 37 | 38 | cat << EOF > $tfile 39 | USE mysql; 40 | DELETE FROM user; 41 | FLUSH PRIVILEGES; 42 | GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY "$MYSQL_ROOT_PASSWORD" WITH GRANT OPTION; 43 | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; 44 | UPDATE user SET password=PASSWORD("") WHERE user='root' AND host='localhost'; 45 | FLUSH PRIVILEGES; 46 | EOF 47 | 48 | echo "Querying user" 49 | /usr/bin/mysqld --user=root --bootstrap --verbose=0 < $tfile 50 | rm -f $tfile 51 | echo "Done query" 52 | 53 | # start mysql 54 | # nohup mysqld_safe --skip-grant-tables --bind-address 0.0.0.0 --user mysql > /dev/null 2>&1 & 55 | echo "Starting mariadb database" 56 | exec /usr/bin/mysqld --user=root --bind-address=0.0.0.0 57 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.11 2 | ENV TIMEZONE America/Santiago 3 | RUN apk update && apk upgrade 4 | RUN apk add mariadb mariadb-client \ 5 | apache2 \ 6 | apache2-utils \ 7 | curl wget \ 8 | tzdata \ 9 | php7-apache2 \ 10 | php7-cli \ 11 | php7-phar \ 12 | php7-zlib \ 13 | php7-zip \ 14 | php7-bz2 \ 15 | php7-ctype \ 16 | php7-curl \ 17 | php7-pdo_mysql \ 18 | php7-mysqli \ 19 | php7-json \ 20 | php7-mcrypt \ 21 | php7-xml \ 22 | php7-dom \ 23 | php7-iconv \ 24 | php7-xdebug \ 25 | php7-session \ 26 | php7-intl \ 27 | php7-gd \ 28 | php7-mbstring \ 29 | php7-apcu \ 30 | php7-opcache \ 31 | php7-tokenizer \ 32 | php7-simplexml 33 | 34 | RUN curl -sS https://getcomposer.org/installer | \ 35 | php -- --install-dir=/usr/bin --filename=composer 36 | # 37 | # sed -i 's#AllowOverride none#AllowOverride All#' /etc/apache2/httpd.conf && \ 38 | # sed -i 's#Require all denied#Require all granted#' /etc/apache2/httpd.conf && \ 39 | # sed -i 's#^DocumentRoot ".*#DocumentRoot "/var/www/localhost/htdocs"#g' /etc/apache2/httpd.conf && \ 40 | 41 | # configure timezone, mysql, apache 42 | RUN cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && \ 43 | echo "${TIMEZONE}" > /etc/timezone && \ 44 | mkdir -p /run/mysqld && chown -R mysql:mysql /run/mysqld /var/lib/mysql && \ 45 | mkdir -p /run/apache2 && chown -R apache:apache /run/apache2 && chown -R apache:apache /var/www/localhost/htdocs/ && \ 46 | sed -i 's#\#LoadModule rewrite_module modules\/mod_rewrite.so#LoadModule rewrite_module modules\/mod_rewrite.so#' /etc/apache2/httpd.conf && \ 47 | sed -i 's#ServerName www.example.com:80#\nServerName localhost:80#' /etc/apache2/httpd.conf && \ 48 | sed -i 's/skip-networking/\#skip-networking/i' /etc/my.cnf.d/mariadb-server.cnf && \ 49 | sed -i '/mariadb\]/a log_error = \/var\/lib\/mysql\/error.log' /etc/my.cnf.d/mariadb-server.cnf && \ 50 | sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/my.cnf.d/mariadb-server.cnf && \ 51 | sed -i '/mariadb\]/a skip-external-locking' /etc/my.cnf.d/mariadb-server.cnf && \ 52 | sed -i '/mariadb\]/a general_log = ON' /etc/my.cnf.d/mariadb-server.cnf && \ 53 | sed -i '/mariadb\]/a general_log_file = \/var\/lib\/mysql\/query.log' /etc/my.cnf.d/mariadb-server.cnf 54 | 55 | RUN sed -i 's#display_errors = Off#display_errors = On#' /etc/php7/php.ini && \ 56 | sed -i 's#upload_max_filesize = 2M#upload_max_filesize = 100M#' /etc/php7/php.ini && \ 57 | sed -i 's#post_max_size = 8M#post_max_size = 100M#' /etc/php7/php.ini && \ 58 | sed -i 's#session.cookie_httponly =#session.cookie_httponly = true#' /etc/php7/php.ini && \ 59 | sed -i 's#error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT#error_reporting = E_ALL#' /etc/php7/php.ini 60 | 61 | 62 | # Configure xdebug 63 | RUN echo "zend_extension=xdebug.so" > /etc/php7/conf.d/xdebug.ini && \ 64 | echo -e "\n[XDEBUG]" >> /etc/php7/conf.d/xdebug.ini && \ 65 | echo "xdebug.remote_enable=1" >> /etc/php7/conf.d/xdebug.ini && \ 66 | echo "xdebug.remote_connect_back=1" >> /etc/php7/conf.d/xdebug.ini && \ 67 | echo "xdebug.idekey=PHPSTORM" >> /etc/php7/conf.d/xdebug.ini && \ 68 | echo "xdebug.remote_log=\"/tmp/xdebug.log\"" >> /etc/php7/conf.d/xdebug.ini 69 | 70 | COPY entry.sh /entry.sh 71 | 72 | RUN chmod u+x /entry.sh 73 | 74 | WORKDIR /var/www/localhost/htdocs/ 75 | 76 | EXPOSE 80 77 | EXPOSE 3306 78 | 79 | ENTRYPOINT ["/entry.sh"] 80 | --------------------------------------------------------------------------------