diff --git a/README.md b/README.md --- a/README.md +++ b/README.md @@ -47,3 +47,13 @@ # If you need other processes, adds a /etc/service/<service name>/run file That's it. + +## How to upgrade this image? + +As noted in https://devcentral.nasqueron.org/T787 we need to sync files and novolume/files. + +For that, you can use our helper Makefile: +``` +cd novolume +make update +``` diff --git a/novolume/Dockerfile b/novolume/Dockerfile --- a/novolume/Dockerfile +++ b/novolume/Dockerfile @@ -83,7 +83,7 @@ chmod 700 /home/app && \ chmod 711 /var/wwwroot/default -COPY ../files / +COPY files / # # Docker properties diff --git a/novolume/Makefile b/novolume/Makefile new file mode 100644 --- /dev/null +++ b/novolume/Makefile @@ -0,0 +1,9 @@ +all: files + +files: + cp -Rp ../files . + +clean: + rm -rf files + +update: clean files diff --git a/novolume/files/etc/nginx/nginx.conf b/novolume/files/etc/nginx/nginx.conf new file mode 100644 --- /dev/null +++ b/novolume/files/etc/nginx/nginx.conf @@ -0,0 +1,43 @@ +# Webserver runs as www-data user +# PHP code runs as app user +# This allows to configure a read-only, can execute web directory. + +user www-data; +worker_processes 4; +pid /run/nginx.pid; +daemon off; + +events { + worker_connections 768; +} + +http { + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + + client_max_body_size 32M; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_prefer_server_ciphers on; + + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log; + + gzip on; + gzip_disable "msie6"; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 6; + gzip_buffers 16 8k; + gzip_http_version 1.1; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; + + include /etc/nginx/conf.d/*.conf; + include /etc/nginx/sites-enabled/*; +} diff --git a/novolume/files/etc/nginx/sites-available/default b/novolume/files/etc/nginx/sites-available/default new file mode 100644 --- /dev/null +++ b/novolume/files/etc/nginx/sites-available/default @@ -0,0 +1,18 @@ +server { + listen 80 default_server; + listen [::]:80 default_server; + server_name _; + + root /var/wwwroot/default; + + index index.html index.php index.htm; + + location / { + try_files $uri $uri/ =404; + } + + location ~ \.php$ { + include snippets/fastcgi-php.conf; + fastcgi_pass 127.0.0.1:9000; + } +} diff --git a/novolume/files/etc/service/nginx/run b/novolume/files/etc/service/nginx/run new file mode 100755 --- /dev/null +++ b/novolume/files/etc/service/nginx/run @@ -0,0 +1,4 @@ +#!/bin/bash +exec 2>&1 +source /usr/local/etc/envvars +exec /usr/sbin/nginx diff --git a/novolume/files/etc/service/php-fpm/run b/novolume/files/etc/service/php-fpm/run new file mode 100755 --- /dev/null +++ b/novolume/files/etc/service/php-fpm/run @@ -0,0 +1,5 @@ +#!/bin/bash +exec 2>&1 +source /usr/local/etc/envvars +php-fpm-env > /usr/local/etc/php-fpm-env.conf +exec /usr/local/sbin/php-fpm --nodaemonize diff --git a/novolume/files/usr/local/bin/docker-php-ext-configure b/novolume/files/usr/local/bin/docker-php-ext-configure new file mode 100755 --- /dev/null +++ b/novolume/files/usr/local/bin/docker-php-ext-configure @@ -0,0 +1,19 @@ +#!/bin/bash +set -e + +ext="$1" +extDir="/usr/src/php/ext/$ext" +if [ -z "$ext" -o ! -d "$extDir" ]; then + echo >&2 "usage: $0 ext-name [configure flags]" + echo >&2 " ie: $0 gd --with-jpeg-dir=/usr/local/something" + echo >&2 + echo >&2 'Possible values for ext-name:' + echo >&2 $(find /usr/src/php/ext -mindepth 2 -maxdepth 2 -type f -name 'config.m4' | cut -d/ -f6 | sort) + exit 1 +fi +shift + +set -x +cd "$extDir" +phpize +./configure "$@" diff --git a/novolume/files/usr/local/bin/docker-php-ext-install b/novolume/files/usr/local/bin/docker-php-ext-install new file mode 100755 --- /dev/null +++ b/novolume/files/usr/local/bin/docker-php-ext-install @@ -0,0 +1,60 @@ +#!/bin/bash +set -e + +cd /usr/src/php/ext + +usage() { + echo "usage: $0 ext-name [ext-name ...]" + echo " ie: $0 gd mysqli" + echo " $0 pdo pdo_mysql" + echo + echo 'if custom ./configure arguments are necessary, see docker-php-ext-configure' + echo + echo 'Possible values for ext-name:' + echo $(find /usr/src/php/ext -mindepth 2 -maxdepth 2 -type f -name 'config.m4' | cut -d/ -f6 | sort) +} + +exts=() +while [ $# -gt 0 ]; do + ext="$1" + shift + if [ -z "$ext" ]; then + continue + fi + if [ ! -d "$ext" ]; then + echo >&2 "error: $(pwd -P)/$ext does not exist" + echo >&2 + usage >&2 + exit 1 + fi + exts+=( "$ext" ) +done + +if [ "${#exts[@]}" -eq 0 ]; then + usage >&2 + exit 1 +fi + +for ext in "${exts[@]}"; do + ( + cd "$ext" + [ -e Makefile ] || docker-php-ext-configure "$ext" + make + make install + ini="/usr/local/etc/php/conf.d/docker-php-ext-$ext.ini" + for module in modules/*.so; do + if [ -f "$module" ]; then + if grep -q zend_extension_entry "$module"; then + # https://wiki.php.net/internals/extensions#loading_zend_extensions + line="zend_extension=$(basename "$module")" + else + line="extension=$(basename "$module")" + fi + if ! grep -q "$line" "$ini"; then + echo "$line" >> "/usr/local/etc/php/conf.d/ext-$ext.ini" + fi + fi + done + make clean + ) +done diff --git a/novolume/files/usr/local/etc/php-fpm.conf b/novolume/files/usr/local/etc/php-fpm.conf new file mode 100644 --- /dev/null +++ b/novolume/files/usr/local/etc/php-fpm.conf @@ -0,0 +1,13 @@ +[app] +listen = 127.0.0.1:9000 +user = app +group = app +pm = ondemand +pm.max_children = 10 +pm.process_idle_timeout = 60 +pm.max_requests = 500 + +php_admin_flag[cgi.fix_pathinfo] = off + +include=etc/php-fpm-env.conf + diff --git a/novolume/files/usr/local/etc/php/conf.d/apcu.ini b/novolume/files/usr/local/etc/php/conf.d/apcu.ini new file mode 100644 --- /dev/null +++ b/novolume/files/usr/local/etc/php/conf.d/apcu.ini @@ -0,0 +1 @@ +extension=apcu.so diff --git a/novolume/files/usr/local/etc/php/conf.d/date.ini b/novolume/files/usr/local/etc/php/conf.d/date.ini new file mode 100644 --- /dev/null +++ b/novolume/files/usr/local/etc/php/conf.d/date.ini @@ -0,0 +1,4 @@ +[date] +date.timezone = UTC +date.default_latitude = 50.37 +date.default_longitude = 4.49 diff --git a/novolume/files/usr/local/etc/php/conf.d/opcache.ini b/novolume/files/usr/local/etc/php/conf.d/opcache.ini new file mode 100644 --- /dev/null +++ b/novolume/files/usr/local/etc/php/conf.d/opcache.ini @@ -0,0 +1,3 @@ +zend_extension=opcache.so +opcache.enable=On +opcache.validate_timestamps=0 diff --git a/novolume/files/usr/local/lib/php-fpm-env/PhpFpmEnvironment.php b/novolume/files/usr/local/lib/php-fpm-env/PhpFpmEnvironment.php new file mode 100755 --- /dev/null +++ b/novolume/files/usr/local/lib/php-fpm-env/PhpFpmEnvironment.php @@ -0,0 +1,103 @@ +#!/usr/bin/env php +<?php + +/** + * Allows to get the content of a php-fpm environment configuration file + */ +class PhpFpmEnvironment { + /** + * The temporary directory, used in TMP, TEMP and TMPDIR environment variables + * @var string + */ + const TMP = '/tmp'; + + /** + * The path where to find executables, where sbin should be excluded if you don't run PHP as root. + * @var string + */ + const PATH = '/usr/local/bin:/usr/bin:/bin'; + + /** + * The environment variables to discard + * @var Array + */ + const VARIABLES_TO_DISCARD = [ + '_', // The caller executable script, not pertinent + 'HOME', // Set correctly by php-fpm + 'TERM', // Not pertinent in server context + 'MYSQL_ENV_MYSQL_ROOT_PASSWORD', // from --link …:mysql + ]; + + /** + * Gets an environment array from the current process environment, + * with PATH and temp variablesfiltered. + * + * @return Array + */ + public static function getEnvironmentVariables () { + $variables = []; + + foreach ($_ENV as $key => $value) { + if (!static::mustIgnoreVariable($key)) { + $variables[$key] = $value; + } + } + + static::addHardcodedEnvironmentVariables($variables); + + return $variables; + } + + /** + * Adds hardcoded and always wanted environment variables + * (path, temporary directory) to the specified array. + * + * @paran array $variables the array to add the variables to + */ + public static function addHardcodedEnvironmentVariables (&$variables) { + static::addTempEnvironmentVariables ($variables); + static::addPathEnvironmentVariables ($variables); + } + + /** + * Adds temporary directory environment variables to the specified array. + * + * @paran array $variables the array to add the variables to + */ + public static function addTempEnvironmentVariables (&$variables) { + $variables['TMP'] = static::TMP; + $variables['TEMP'] = static::TMP; + $variables['TMPDIR'] = static::TMP; + } + + /** + * Adds temporary directory environment variables to the specified array. + * + * @paran array $variables the array to add the variables to + */ + public static function addPathEnvironmentVariables (&$variables) { + $variables['PATH'] = static::PATH; + } + + /** + * Determines if the variable name must be ignored + * + * @return bool true if the variable must be ignored; otherwise, false. + */ + public static function mustIgnoreVariable ($variableName) { + return in_array($variableName, static::VARIABLES_TO_DISCARD); + } + + /** + * Prints the environment + */ + public static function printConfig () { + $variables = static::getEnvironmentVariables(); + + foreach ($variables as $key => $value) { + echo 'env["', $key, '"] = "', $value, '"', PHP_EOL; + } + } +} + +PhpFpmEnvironment::printConfig(); diff --git a/novolume/files/usr/local/sbin/php-fpm-env b/novolume/files/usr/local/sbin/php-fpm-env new file mode 120000 --- /dev/null +++ b/novolume/files/usr/local/sbin/php-fpm-env @@ -0,0 +1 @@ +../lib/php-fpm-env/PhpFpmEnvironment.php \ No newline at end of file diff --git a/novolume/files/usr/local/sbin/runsvdir-init b/novolume/files/usr/local/sbin/runsvdir-init new file mode 100755 --- /dev/null +++ b/novolume/files/usr/local/sbin/runsvdir-init @@ -0,0 +1,3 @@ +#!/bin/bash +export > /usr/local/etc/envvars +exec /usr/sbin/runsvdir-start