From e50cb2cdd83f90d18fb9b8ee84a797e1232a72ac Mon Sep 17 00:00:00 2001 From: Aleksander Cynarski Date: Sun, 28 Mar 2021 20:50:39 +0200 Subject: [PATCH] alpine support --- .dockerignore | 2 + .drone.yml | 56 +++++++++ Dockerfile | 108 ++++++++++++++++++ README.md | 78 +++++++++++++ docker/etc/nginx/conf.d/default.conf.disabled | 23 ++++ docker/etc/nginx/conf.d/sf.conf.disabled | 40 +++++++ docker/etc/nginx/conf.d/sf3.conf.disabled | 37 ++++++ docker/etc/nginx/nginx.conf | 38 ++++++ docker/etc/supervisor/services/.gitkeep | 0 docker/etc/supervisor/services/nginx.conf | 6 + docker/etc/supervisor/services/php-fpm.conf | 6 + docker/tools/ngxconfig | 37 ++++++ 12 files changed, 431 insertions(+) create mode 100644 .dockerignore create mode 100644 .drone.yml create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 docker/etc/nginx/conf.d/default.conf.disabled create mode 100644 docker/etc/nginx/conf.d/sf.conf.disabled create mode 100644 docker/etc/nginx/conf.d/sf3.conf.disabled create mode 100644 docker/etc/nginx/nginx.conf create mode 100644 docker/etc/supervisor/services/.gitkeep create mode 100644 docker/etc/supervisor/services/nginx.conf create mode 100644 docker/etc/supervisor/services/php-fpm.conf create mode 100755 docker/tools/ngxconfig diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..c53c08c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +.git +tags diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..bdc8559 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,56 @@ +kind: pipeline +name: default + +steps: +- name: php7.4 + image: plugins/docker + settings: + username: + from_secret: hub_username + password: + from_secret: hub_password + repo: + from_secret: hub_repo + build_args: + - PHP_VERSION=7.4-fpm-alpine3.13 + tags: 7.4-alpine + when: + branch: + - alpine + depends_on: [ clone ] + +- name: php7.3 + image: plugins/docker + settings: + username: + from_secret: hub_username + password: + from_secret: hub_password + repo: + from_secret: hub_repo + build_args: + - PHP_VERSION=7.3-fpm-alpine3.12 + tags: 7.3-alpine + when: + branch: + - alpine + depends_on: [ clone ] + +- name: php7.2 + image: plugins/docker + settings: + username: + from_secret: hub_username + password: + from_secret: hub_password + repo: + from_secret: hub_repo + build_args: + - PHP_VERSION=7.2-fpm-alpine3.12 + tags: 7.2-alpine + when: + branch: + - alpine + depends_on: [ clone ] + + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..fe66ec8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,108 @@ +ARG PHP_VERSION=7.4-fpm-alpine3.13 + +FROM paramah/base:alpine as base-config + +# +# Build php extenstions +# +#================================================== +FROM php:${PHP_VERSION} as builder + +RUN apk add --no-cache wget \ + curl \ + bash \ + git \ + openssh \ + openssl \ + bzip2-dev \ + curl-dev \ + libpng libpng-dev \ + icu-dev \ + gettext gettext-dev \ + imap-dev \ + ldb-dev libldap openldap-dev \ + oniguruma-dev \ + postgresql-dev \ + sqlite sqlite-dev \ + libxml2-dev \ + libzip libzip-dev zip + +# Install php extensions +RUN docker-php-ext-install -j$(nproc) \ + bcmath \ + bz2 \ + curl \ + fileinfo \ + gd \ + gettext \ + iconv \ + imap \ + intl \ + json \ + ldap \ + mbstring \ + opcache \ + pcntl \ + pdo \ + pdo_mysql \ + pdo_pgsql \ + pdo_sqlite \ + pgsql \ + phar \ + session \ + simplexml \ + soap \ + xml \ + zip + + +# +# Final image +# +#================================================== +FROM php:${PHP_VERSION} + +# install system libs +RUN apk add --no-cache libintl c-client libpng icu-libs libldap libpq libzip + +# Install apps +RUN apk add --no-cache wget curl bash git openssh supervisor nginx openssl zip + +ENV DIR /var/www +ENV DOCKERIZE_VERSION v0.6.1 + +# Install dockerize +RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz + +COPY --from=base-config /etc/supervisor /etc/supervisor +COPY --from=builder /usr/local/lib/php /usr/local/lib/php +COPY --from=builder /usr/local/etc /usr/local/etc + +#install composer (v2 with parallel downloads) +RUN wget -O /bin/composer https://getcomposer.org/composer.phar +RUN chmod a+x /bin/composer + +#install cachetool +RUN wget -O /bin/cachetool http://gordalina.github.io/cachetool/downloads/cachetool.phar +RUN chmod a+x /bin/cachetool + +#install phpunit +RUN wget -O phpunit https://phar.phpunit.de/phpunit-9.phar +RUN install phpunit /usr/local/bin + +# Create directories +RUN mkdir -p /var/www + +WORKDIR $DIR + +# Copy base configuration files +COPY docker/etc /etc/ + +# Copy docker tools +COPY docker/tools /usr/local/bin/ + +EXPOSE 80 + +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"] \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..4a65c14 --- /dev/null +++ b/README.md @@ -0,0 +1,78 @@ +# PHP 7.4 (nginx, fpm, supervisord) + +New base. + + + +# All extension + +``` +# Install dockerize +RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && docker-php-ext-install -j$(nproc) \ + bcmath \ + bz2 \ + calendar \ + ctype \ + curl \ + dba \ + dom \ + enchant \ + exif \ + ffi \ + fileinfo \ + filter \ + ftp \ + gd \ + gettext \ + gmp \ + hash \ + iconv \ + imap \ + intl \ + json \ + ldap \ + mbstring \ + mysqli \ + oci8 \ + odbc \ + opcache \ + pcntl \ + pdo \ + pdo_dblib \ + pdo_firebird \ + pdo_mysql \ + pdo_oci \ + pdo_odbc \ + pdo_pgsql \ + pdo_sqlite \ + pgsql \ + phar \ + posix \ + pspell \ + readline \ + reflection \ + session \ + shmop \ + simplexml \ + snmp \ + soap \ + sockets \ + sodium \ + spl \ + standard \ + sysvmsg \ + sysvsem \ + sysvshm \ + tidy \ + tokenizer \ + xml \ + xmlreader \ + xmlrpc \ + xmlwriter \ + xsl \ + zend_test \ + zip +``` \ No newline at end of file diff --git a/docker/etc/nginx/conf.d/default.conf.disabled b/docker/etc/nginx/conf.d/default.conf.disabled new file mode 100644 index 0000000..5446e6a --- /dev/null +++ b/docker/etc/nginx/conf.d/default.conf.disabled @@ -0,0 +1,23 @@ +server { + server_name _; + root /var/www/; + + location / { + try_files $uri /index.php$is_args$args; + } + + location ~ ^/index\.php(/|$) { + fastcgi_pass 127.0.0.1:9000; + fastcgi_split_path_info ^(.+\.php)(/.*)$; + include fastcgi_params; + + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + fastcgi_param DOCUMENT_ROOT $realpath_root; + } + + # return 404 for all other php files not matching the front controller + # this prevents access to other php files you don't want to be accessible. + location ~ \.php$ { + return 404; + } +} \ No newline at end of file diff --git a/docker/etc/nginx/conf.d/sf.conf.disabled b/docker/etc/nginx/conf.d/sf.conf.disabled new file mode 100644 index 0000000..8d3ded2 --- /dev/null +++ b/docker/etc/nginx/conf.d/sf.conf.disabled @@ -0,0 +1,40 @@ +server { + server_name _; + root /var/www/public; + + location / { + # try to serve file directly, fallback to index.php + try_files $uri /index.php$is_args$args; + } + + location ~ ^/index\.php(/|$) { + fastcgi_pass 127.0.0.1:9000; + fastcgi_split_path_info ^(.+\.php)(/.*)$; + include fastcgi_params; + + # optionally set the value of the environment variables used in the application + # fastcgi_param APP_ENV prod; + # fastcgi_param APP_SECRET ; + # fastcgi_param DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name"; + + # When you are using symlinks to link the document root to the + # current version of your application, you should pass the real + # application path instead of the path to the symlink to PHP + # FPM. + # Otherwise, PHP's OPcache may not properly detect changes to + # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126 + # for more information). + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + fastcgi_param DOCUMENT_ROOT $realpath_root; + # Prevents URIs that include the front controller. This will 404: + # http://domain.tld/index.php/some-path + # Remove the internal directive to allow URIs like this + internal; + } + + # return 404 for all other php files not matching the front controller + # this prevents access to other php files you don't want to be accessible. + location ~ \.php$ { + return 404; + } +} \ No newline at end of file diff --git a/docker/etc/nginx/conf.d/sf3.conf.disabled b/docker/etc/nginx/conf.d/sf3.conf.disabled new file mode 100644 index 0000000..2980833 --- /dev/null +++ b/docker/etc/nginx/conf.d/sf3.conf.disabled @@ -0,0 +1,37 @@ +server { + client_max_body_size 108M; + + root /var/www/web; + + rewrite ^/app\.php/?(.*)$ /$1 permanent; + + try_files $uri @rewriteapp; + + location @rewriteapp { + rewrite ^(.*)$ /app.php/$1 last; + } + + # Deny all . files + location ~ /\. { + deny all; + } + + location ~ ^/(app|app_dev)\.php(/|$) { + + fastcgi_pass 127.0.0.1:9000; + fastcgi_split_path_info ^(.+\.php)(/.*)$; + fastcgi_index app.php; + send_timeout 1800; + fastcgi_read_timeout 1800; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_buffers 16 16k; + fastcgi_buffer_size 32k; + include fastcgi_params; + } + + location /(bundles|media) { + access_log off; + expires 30d; + try_files $uri @rewriteapp; + } +} \ No newline at end of file diff --git a/docker/etc/nginx/nginx.conf b/docker/etc/nginx/nginx.conf new file mode 100644 index 0000000..d735c8c --- /dev/null +++ b/docker/etc/nginx/nginx.conf @@ -0,0 +1,38 @@ +user www-data; +daemon off; +pid /run/nginx.pid; +worker_processes auto; +worker_rlimit_nofile 65535; + +include /etc/nginx/modules/*.conf; + +events { + multi_accept on; + worker_connections 65535; +} + +http { + charset utf-8; + sendfile on; + tcp_nopush on; + tcp_nodelay on; + server_tokens off; + log_not_found off; + types_hash_max_size 2048; + client_max_body_size 16M; + + # MIME + include mime.types; + default_type application/octet-stream; + + # logging + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log warn; + + #gzip + gzip on; + + # load configs + include /etc/nginx/conf.d/*.conf; + include /etc/nginx/sites-enabled/*; +} diff --git a/docker/etc/supervisor/services/.gitkeep b/docker/etc/supervisor/services/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/docker/etc/supervisor/services/nginx.conf b/docker/etc/supervisor/services/nginx.conf new file mode 100644 index 0000000..af9cbea --- /dev/null +++ b/docker/etc/supervisor/services/nginx.conf @@ -0,0 +1,6 @@ +[program:nginx] +command=/usr/sbin/nginx +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +redirect_stderr=true diff --git a/docker/etc/supervisor/services/php-fpm.conf b/docker/etc/supervisor/services/php-fpm.conf new file mode 100644 index 0000000..6aab954 --- /dev/null +++ b/docker/etc/supervisor/services/php-fpm.conf @@ -0,0 +1,6 @@ +[program:php-fpm] +command=/usr/local/sbin/php-fpm -R -F +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +redirect_stderr=true diff --git a/docker/tools/ngxconfig b/docker/tools/ngxconfig new file mode 100755 index 0000000..1752d26 --- /dev/null +++ b/docker/tools/ngxconfig @@ -0,0 +1,37 @@ +#!/bin/bash +set -eo pipefail +shopt -s nullglob + +CONF_DIR=/etc/nginx/conf.d + +usage() { + echo -e "Usage: ngxconfig file\n" + echo -e "Enables given nginx configuration stored in \"${CONF_DIR}\" as \".disabled\"." + echo -e "Exits with code 1 if configuration file was not found.\n" + echo -e "Options:\n" + echo -e " -h | --help\n\tShow this help.\n" + echo -e "Example:\n ngxconfig sf.conf\n" +} + +config= + +while [[ "$1" != "" ]]; do + case $1 in + -h | --help ) usage + exit + ;; + * ) config=$1 + esac + shift +done + +if [[ -f "/etc/nginx/conf.d/${config}.disabled" ]]; then + echo "Enabling config \"${config}\"..." + rm ${CONF_DIR}/default.conf + mv ${CONF_DIR}/${config}.disabled ${CONF_DIR}/${config} +elif [[ -f "/etc/nginx/conf.d/${config}" ]]; then + echo "Config \"${config}\" already enabled!" +else + echo "Config \"${config}\" not found!" + exit 1 +fi