diff --git a/Dockerfiles/mods/Dockerfile-5.3 b/Dockerfiles/mods/Dockerfile-5.3 index c97cd8c..2e15ff1 100644 --- a/Dockerfiles/mods/Dockerfile-5.3 +++ b/Dockerfiles/mods/Dockerfile-5.3 @@ -116,6 +116,16 @@ RUN set -x \ ${BUILD_DEPS} \ \ \ + && EXTENSION_DIR="$( php -i | grep ^extension_dir | awk -F '=>' '{print $2}' | xargs )" \ +&& if [ ! -d "${EXTENSION_DIR}" ]; then mkdir -p "${EXTENSION_DIR}"; fi \ +&& curl https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz -L -o ioncube.tar.gz \ +&& tar xvfz ioncube.tar.gz \ +&& cd ioncube \ +&& cp "ioncube_loader_lin_5.3.so" "${EXTENSION_DIR}/ioncube.so" \ +&& cd ../ \ +&& rm -rf ioncube \ +&& rm -rf ioncube.tar.gz \ + \ && echo "/usr" | pecl install amqp \ && docker-php-ext-enable amqp \ && pecl install apcu-4.0.11 \ diff --git a/Dockerfiles/mods/Dockerfile-5.4 b/Dockerfiles/mods/Dockerfile-5.4 index c6952c9..c94b85d 100644 --- a/Dockerfiles/mods/Dockerfile-5.4 +++ b/Dockerfiles/mods/Dockerfile-5.4 @@ -116,6 +116,16 @@ RUN set -x \ ${BUILD_DEPS} \ \ \ + && EXTENSION_DIR="$( php -i | grep ^extension_dir | awk -F '=>' '{print $2}' | xargs )" \ +&& if [ ! -d "${EXTENSION_DIR}" ]; then mkdir -p "${EXTENSION_DIR}"; fi \ +&& curl https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz -L -o ioncube.tar.gz \ +&& tar xvfz ioncube.tar.gz \ +&& cd ioncube \ +&& cp "ioncube_loader_lin_5.4.so" "${EXTENSION_DIR}/ioncube.so" \ +&& cd ../ \ +&& rm -rf ioncube \ +&& rm -rf ioncube.tar.gz \ + \ && echo "/usr" | pecl install amqp \ && docker-php-ext-enable amqp \ && pecl install apcu-4.0.11 \ diff --git a/Dockerfiles/mods/Dockerfile-5.5 b/Dockerfiles/mods/Dockerfile-5.5 index d5a734b..975c25b 100644 --- a/Dockerfiles/mods/Dockerfile-5.5 +++ b/Dockerfiles/mods/Dockerfile-5.5 @@ -118,6 +118,16 @@ RUN set -x \ ${BUILD_DEPS} \ \ \ + && EXTENSION_DIR="$( php -i | grep ^extension_dir | awk -F '=>' '{print $2}' | xargs )" \ +&& if [ ! -d "${EXTENSION_DIR}" ]; then mkdir -p "${EXTENSION_DIR}"; fi \ +&& curl https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz -L -o ioncube.tar.gz \ +&& tar xvfz ioncube.tar.gz \ +&& cd ioncube \ +&& cp "ioncube_loader_lin_5.5.so" "${EXTENSION_DIR}/ioncube.so" \ +&& cd ../ \ +&& rm -rf ioncube \ +&& rm -rf ioncube.tar.gz \ + \ && echo "/usr" | pecl install amqp \ && docker-php-ext-enable amqp \ && pecl install apcu-4.0.11 \ diff --git a/Dockerfiles/mods/Dockerfile-5.6 b/Dockerfiles/mods/Dockerfile-5.6 index ad01cf8..cff6697 100644 --- a/Dockerfiles/mods/Dockerfile-5.6 +++ b/Dockerfiles/mods/Dockerfile-5.6 @@ -120,6 +120,16 @@ RUN set -x \ ${BUILD_DEPS} \ \ \ + && EXTENSION_DIR="$( php -i | grep ^extension_dir | awk -F '=>' '{print $2}' | xargs )" \ +&& if [ ! -d "${EXTENSION_DIR}" ]; then mkdir -p "${EXTENSION_DIR}"; fi \ +&& curl https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz -L -o ioncube.tar.gz \ +&& tar xvfz ioncube.tar.gz \ +&& cd ioncube \ +&& cp "ioncube_loader_lin_5.6.so" "${EXTENSION_DIR}/ioncube.so" \ +&& cd ../ \ +&& rm -rf ioncube \ +&& rm -rf ioncube.tar.gz \ + \ && echo "/usr" | pecl install amqp \ && docker-php-ext-enable amqp \ && pecl install apcu-4.0.11 \ diff --git a/Dockerfiles/mods/Dockerfile-7.0 b/Dockerfiles/mods/Dockerfile-7.0 index 5bdf96b..0f13eaf 100644 --- a/Dockerfiles/mods/Dockerfile-7.0 +++ b/Dockerfiles/mods/Dockerfile-7.0 @@ -118,6 +118,16 @@ RUN set -x \ ${BUILD_DEPS} \ \ \ + && EXTENSION_DIR="$( php -i | grep ^extension_dir | awk -F '=>' '{print $2}' | xargs )" \ +&& if [ ! -d "${EXTENSION_DIR}" ]; then mkdir -p "${EXTENSION_DIR}"; fi \ +&& curl https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz -L -o ioncube.tar.gz \ +&& tar xvfz ioncube.tar.gz \ +&& cd ioncube \ +&& cp "ioncube_loader_lin_7.0.so" "${EXTENSION_DIR}/ioncube.so" \ +&& cd ../ \ +&& rm -rf ioncube \ +&& rm -rf ioncube.tar.gz \ + \ && echo "/usr" | pecl install amqp \ && docker-php-ext-enable amqp \ && pecl install apcu \ diff --git a/Dockerfiles/mods/Dockerfile-7.1 b/Dockerfiles/mods/Dockerfile-7.1 index 78e5723..6ef603d 100644 --- a/Dockerfiles/mods/Dockerfile-7.1 +++ b/Dockerfiles/mods/Dockerfile-7.1 @@ -118,6 +118,16 @@ RUN set -x \ ${BUILD_DEPS} \ \ \ + && EXTENSION_DIR="$( php -i | grep ^extension_dir | awk -F '=>' '{print $2}' | xargs )" \ +&& if [ ! -d "${EXTENSION_DIR}" ]; then mkdir -p "${EXTENSION_DIR}"; fi \ +&& curl https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz -L -o ioncube.tar.gz \ +&& tar xvfz ioncube.tar.gz \ +&& cd ioncube \ +&& cp "ioncube_loader_lin_7.1.so" "${EXTENSION_DIR}/ioncube.so" \ +&& cd ../ \ +&& rm -rf ioncube \ +&& rm -rf ioncube.tar.gz \ + \ && echo "/usr" | pecl install amqp \ && docker-php-ext-enable amqp \ && pecl install apcu \ diff --git a/Dockerfiles/mods/Dockerfile-7.2 b/Dockerfiles/mods/Dockerfile-7.2 index f58acd8..f28e2fc 100644 --- a/Dockerfiles/mods/Dockerfile-7.2 +++ b/Dockerfiles/mods/Dockerfile-7.2 @@ -119,6 +119,16 @@ RUN set -x \ ${BUILD_DEPS} \ \ \ + && EXTENSION_DIR="$( php -i | grep ^extension_dir | awk -F '=>' '{print $2}' | xargs )" \ +&& if [ ! -d "${EXTENSION_DIR}" ]; then mkdir -p "${EXTENSION_DIR}"; fi \ +&& curl https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz -L -o ioncube.tar.gz \ +&& tar xvfz ioncube.tar.gz \ +&& cd ioncube \ +&& cp "ioncube_loader_lin_7.2.so" "${EXTENSION_DIR}/ioncube.so" \ +&& cd ../ \ +&& rm -rf ioncube \ +&& rm -rf ioncube.tar.gz \ + \ && pecl install amqp \ && docker-php-ext-enable amqp \ && pecl install apcu \ diff --git a/Dockerfiles/prod/data/docker-entrypoint.d/38-enable-modules.sh b/Dockerfiles/prod/data/docker-entrypoint.d/38-enable-modules.sh new file mode 100755 index 0000000..68b202e --- /dev/null +++ b/Dockerfiles/prod/data/docker-entrypoint.d/38-enable-modules.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +set -e +set -u +set -o pipefail + + +############################################################ +# Functions +############################################################ + +### +### Enable PHP Modules +### +enable_modules() { + local mod_varname="${1}" + local debug="${2}" + local cfg_path="/usr/local/etc/php/conf.d" + local mod_path= + mod_path="$( php -i | grep ^extension_dir | awk -F '=>' '{print $2}' | xargs )" + + + if ! env_set "${mod_varname}"; then + log "info" "\$${mod_varname} not set. Not enabling any PHP modules." "${debug}" + else + mods="$( env_get "${mod_varname}" )" + + if [ -z "${mods}" ]; then + log "info" "\$${mod_varname} set, but empty. Not enabling any PHP modules." "${debug}" + else + log "info" "Enabling the following PHP modules: ${mods}" "${debug}" + fi + + while read -r mod; do + mod="$( echo "${mod}" | xargs )" # trim + + # Does the module exist? + if [ -f "${mod_path}/${mod}.so" ]; then + # Exceptions to load speficially + if [ "${mod}" = "ioncube" ]; then + run "eche 'zend_extension=${mod_path}/ioncube.so' > '${cfg_path}/docker-ext-php-ext-ioncube.ini'" "${debug}" + # Generic Load + else + run "docker-php-ext-enable ${mod} || true" "${debug}" + fi + else + log "warn" "Enabling PHP Module: '${mod}' does not exist" "${debug}" + fi + done <<< "$( echo "${mods}" | tr ',' '\n' )" + fi +} diff --git a/Dockerfiles/prod/data/docker-entrypoint.d/38-disable-modules.sh b/Dockerfiles/prod/data/docker-entrypoint.d/39-disable-modules.sh similarity index 80% rename from Dockerfiles/prod/data/docker-entrypoint.d/38-disable-modules.sh rename to Dockerfiles/prod/data/docker-entrypoint.d/39-disable-modules.sh index 0c0ee8f..6ddb99e 100755 --- a/Dockerfiles/prod/data/docker-entrypoint.d/38-disable-modules.sh +++ b/Dockerfiles/prod/data/docker-entrypoint.d/39-disable-modules.sh @@ -15,7 +15,7 @@ set -o pipefail disable_modules() { local mod_varname="${1}" local debug="${2}" - local mod_path="/usr/local/etc/php/conf.d" + local cfg_path="/usr/local/etc/php/conf.d" if ! env_set "${mod_varname}"; then log "info" "\$${mod_varname} not set. Not disabling any PHP modules." "${debug}" @@ -23,17 +23,16 @@ disable_modules() { mods="$( env_get "${mod_varname}" )" if [ -z "${mods}" ]; then - log "warn" "\$${mod_varname} set, but empty. Not disabling any PHP modules." "${debug}" + log "info" "\$${mod_varname} set, but empty. Not disabling any PHP modules." "${debug}" else log "info" "Disabling the following PHP modules: ${mods}" "${debug}" fi while read -r mod; do - #for mod in ${mods//,/ }; do mod="$( echo "${mod}" | xargs )" # trim # Find all config files that enable that module - files="$( grep -Er "^(zend_)?extension.*(=|/)${mod}\.so" "${mod_path}" || true )" + files="$( grep -Er "^(zend_)?extension.*(=|/)${mod}\.so" "${cfg_path}" || true )" if [ -n "${files}" ]; then while read -r f; do @@ -44,6 +43,5 @@ disable_modules() { done <<< "${files}" fi done <<< "$( echo "${mods}" | tr ',' '\n' )" - #done fi } diff --git a/Dockerfiles/prod/data/docker-entrypoint.sh b/Dockerfiles/prod/data/docker-entrypoint.sh index 3255fa0..3ee6522 100755 --- a/Dockerfiles/prod/data/docker-entrypoint.sh +++ b/Dockerfiles/prod/data/docker-entrypoint.sh @@ -160,6 +160,12 @@ copy_ini_files "${PHP_CUST_INI_DIR}" "${PHP_INI_DIR}" "${DEBUG_LEVEL}" copy_fpm_files "${PHP_CUST_FPM_DIR}" "${PHP_FPM_DIR}" "${DEBUG_LEVEL}" +### +### Enable PHP Modules +### +enable_modules "ENABLE_MODULES" "${DEBUG_LEVEL}" + + ### ### Disable PHP Modules ### diff --git a/Dockerfiles/work/data/docker-entrypoint.sh b/Dockerfiles/work/data/docker-entrypoint.sh index 038983b..7e8398a 100755 --- a/Dockerfiles/work/data/docker-entrypoint.sh +++ b/Dockerfiles/work/data/docker-entrypoint.sh @@ -160,6 +160,12 @@ copy_ini_files "${PHP_CUST_INI_DIR}" "${PHP_INI_DIR}" "${DEBUG_LEVEL}" copy_fpm_files "${PHP_CUST_FPM_DIR}" "${PHP_FPM_DIR}" "${DEBUG_LEVEL}" +### +### Enable PHP Modules +### +enable_modules "ENABLE_MODULES" "${DEBUG_LEVEL}" + + ### ### Disable PHP Modules ### diff --git a/README.md b/README.md index 9c766b6..12863ab 100644 --- a/README.md +++ b/README.md @@ -610,7 +610,7 @@ Have a look at the following table to see all supported environment variables fo - prod

work + prod

work TIMEZONE string UTC @@ -622,6 +622,12 @@ Have a look at the following table to see all supported environment variables fo 1 By default all Docker images are configured to output their PHP-FPM access and error logs to stdout and stderr. Those which support it can change the behaviour to log into files inside the container. Their respective directories are available as volumes that can be mounted to the host computer. This feature might help developer who are more comfortable with tailing or searching through actual files instead of using docker logs.

Set this variable to 0 in order to enable logging to files. Log files are avilable under /var/log/php/ which is also a docker volume that can be mounted locally. + + ENABLE_MODULES + string + '' + Comma separated list of PHP modules to enable, which are not enabled by default.
Example:
ENABLE_MODULES=ioncube + DISABLE_MODULES string diff --git a/build/ansible/DOCKERFILES/Dockerfile-mods.j2 b/build/ansible/DOCKERFILES/Dockerfile-mods.j2 index c770d7a..a1ae34b 100644 --- a/build/ansible/DOCKERFILES/Dockerfile-mods.j2 +++ b/build/ansible/DOCKERFILES/Dockerfile-mods.j2 @@ -113,6 +113,9 @@ RUN set -x \ {% endif %} && docker-php-ext-enable {{ ext }} \ && cd / && rm -rf /tmp/{{ ext }} \ +{# ---- 4.) CUSTOM ---- #} +{% elif extensions_available[ext][php_version]['type'] == 'custom' %} + && {{ extensions_available[ext][php_version]['command'] }} \ {% endif %} {# ---------- Installation (generic) ---------- #} {% elif 'all' in extensions_available[ext] and 'type' in extensions_available[ext]['all'] %} @@ -147,6 +150,9 @@ RUN set -x \ {% endif %} && docker-php-ext-enable {{ ext }} \ && cd / && rm -rf /tmp/{{ ext }} \ +{# ---- 4.) CUSTOM ---- #} +{% elif extensions_available[ext]['all']['type'] == 'custom' %} + && {{ extensions_available[ext]['all']['command'] }} \ {% endif %} {% endif %} {% endif %} @@ -181,6 +187,8 @@ RUN set -x \ {% if ext == 'opcache' %} && php -m | grep -oiE '^Zend Opcache$' \ && php-fpm -m | grep -oiE '^Zend Opcache$' \ +{% elif ext == 'ioncube' %} +{# Not enabled #} {% else %} && php -m | grep -oiE '^{{ ext }}$' \ && php-fpm -m | grep -oiE '^{{ ext }}$' \ diff --git a/build/ansible/group_vars/all.yml b/build/ansible/group_vars/all.yml index 044d192..ab177f1 100644 --- a/build/ansible/group_vars/all.yml +++ b/build/ansible/group_vars/all.yml @@ -398,6 +398,8 @@ software_available: ### Extensions to actually enable ### extensions_enabled: + # ioncube must be loaded first + - ioncube - amqp - apcu - bcmath @@ -505,6 +507,8 @@ extensions_enabled: # git_ref: [optional] Tag, branch, commit to checkout # configure: [optional] Add './configure' arguments # command: [optional] Overwrite default command (phpize && ./configure && make && make install) +# type: custom +# command: [required] Custom command to install and enable a module extensions_available: amqp: disabled: [7.3] @@ -663,6 +667,20 @@ extensions_available: type: builtin build_dep: [libicu-dev] run_dep: [libicu52] + ioncube: + disabled: [7.3] + all: + type: custom + command: | + EXTENSION_DIR="$( php -i | grep ^extension_dir | awk -F '=>' '{print $2}' | xargs )" \ + && if [ ! -d "${EXTENSION_DIR}" ]; then mkdir -p "${EXTENSION_DIR}"; fi \ + && curl https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz -L -o ioncube.tar.gz \ + && tar xvfz ioncube.tar.gz \ + && cd ioncube \ + && cp "ioncube_loader_lin_{{ php_version }}.so" "${EXTENSION_DIR}/ioncube.so" \ + && cd ../ \ + && rm -rf ioncube \ + && rm -rf ioncube.tar.gz \ json: 7.0: type: builtin