FROM php:7.1-fpm-alpine as dist LABEL maintainer aynic.os ARG DOCKER_BUILD_DIR ARG AMQP_VERSION=stable ARG AST_VERSION=stable ARG APCU_VERSION=stable ARG BLACKFIRE_VERSION=1.34.3 ARG CACHETOOL_VERSION=4.0.1 ARG DS_VERSION=stable ARG EVENT_VERSION=stable ARG IGBINARY_VERSION=stable ARG IMAGICK_VERSION=stable ARG GEOIP_VERSION=beta ARG GRPC_VERSION=stable ARG MCRYPT_VERSION=stable ARG MEMCACHE_VERSION=4.0.1-php73 ARG MEMCACHED_VERSION=stable ARG MONGODB_VERSION=stable ARG NEWRELIC_VERSION=9.11.0.267 ARG OAUTH_VERSION=stable ARG RAR_VERSION=stable ARG REDIS_VERSION=stable ARG SNUFFLEUPAGUS_VERSION=0.5.1 ARG UUID_VERSION=stable ARG XDEBUG_VERSION=stable ARG XHPROF_VERSION=2.2.0 ARG YAML_VERSION=stable RUN apk --no-cache upgrade \ && apk add --no-cache --virtual .build-deps \ $PHPIZE_DEPS \ aspell-dev \ bison \ bzip2-dev \ curl-dev \ enchant-dev \ flex \ freetype-dev \ gawk \ geoip-dev \ gettext-dev \ gmp-dev \ icu-dev \ imagemagick-dev \ imap-dev \ libevent-dev \ libjpeg-turbo-dev \ libmcrypt-dev \ libmemcached-dev \ libpng-dev \ libressl-dev \ libxml2-dev \ libxslt-dev \ make \ net-snmp-dev \ openldap-dev \ postgresql-dev \ pcre-dev \ rabbitmq-c-dev \ yaml-dev \ zlib-dev \ # blackfire \ && wget https://packages.blackfire.io/binaries/blackfire-php/${BLACKFIRE_VERSION}/blackfire-php-alpine_amd64-php-$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;").so -O $(php -r "echo ini_get('extension_dir');")/blackfire.so \ # gd \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ \ # memcache \ && wget https://github.com/websupport-sk/pecl-memcache/archive/v${MEMCACHE_VERSION}.tar.gz -O /tmp/memcache-${MEMCACHE_VERSION}.tar.gz \ && mkdir -p /tmp/memcache-${MEMCACHE_VERSION} \ && tar xzf /tmp/memcache-${MEMCACHE_VERSION}.tar.gz -C /tmp/memcache-${MEMCACHE_VERSION} --strip-components=1 \ # https://github.com/websupport-sk/pecl-memcache/pull/39 \ && sed -i '399s/);/, char *);/' /tmp/memcache-${MEMCACHE_VERSION}/php7/memcache_pool.h \ # https://github.com/websupport-sk/pecl-memcache/pull/40 \ && sed -i '47i#if PHP_VERSION_ID < 70200\n register size_t newlen;\n#endif' /tmp/memcache-${MEMCACHE_VERSION}/php7/memcache_pool.c \ # newrelic \ && wget https://download.newrelic.com/php_agent/archive/${NEWRELIC_VERSION}/newrelic-php5-${NEWRELIC_VERSION}-linux-musl.tar.gz -O /tmp/newrelic-${NEWRELIC_VERSION}.tar.gz \ && mkdir -p /tmp/newrelic-${NEWRELIC_VERSION} \ && tar xzf /tmp/newrelic-${NEWRELIC_VERSION}.tar.gz -C /tmp/newrelic-${NEWRELIC_VERSION} --strip-components=1 \ && mv /tmp/newrelic-${NEWRELIC_VERSION}/agent/x64/newrelic-20160303.so $(php -r "echo ini_get('extension_dir');")/newrelic.so \ # snuffleupagus \ && wget https://github.com/jvoisin/snuffleupagus/archive/v${SNUFFLEUPAGUS_VERSION}.tar.gz -O /tmp/snuffleupagus-${SNUFFLEUPAGUS_VERSION}.tar.gz \ && mkdir -p /tmp/snuffleupagus-${SNUFFLEUPAGUS_VERSION} \ && tar xzf /tmp/snuffleupagus-${SNUFFLEUPAGUS_VERSION}.tar.gz -C /tmp/snuffleupagus-${SNUFFLEUPAGUS_VERSION} --strip-components=1 \ && docker-php-ext-configure /tmp/snuffleupagus-${SNUFFLEUPAGUS_VERSION}/src --prefix=/usr --enable-snuffleupagus \ # xhprof \ && wget https://github.com/longxinH/xhprof/archive/v${XHPROF_VERSION}.tar.gz -O /tmp/xhprof-${XHPROF_VERSION}.tar.gz \ && mkdir -p /tmp/xhprof-${XHPROF_VERSION} \ && tar xzf /tmp/xhprof-${XHPROF_VERSION}.tar.gz -C /tmp/xhprof-${XHPROF_VERSION} --strip-components=1 \ && docker-php-ext-configure /tmp/xhprof-${XHPROF_VERSION}/extension --with-php-config=/usr/local/bin/php-config \ && docker-php-ext-install -j$(nproc) \ bcmath \ bz2 \ calendar \ dba \ enchant \ exif \ gd \ gettext \ gmp \ imap \ intl \ ldap \ mcrypt \ /tmp/memcache-${MEMCACHE_VERSION} \ mysqli \ opcache \ pcntl \ pdo_mysql \ pdo_pgsql \ pgsql \ pspell \ shmop \ snmp \ soap \ sockets \ sysvmsg \ sysvsem \ sysvshm \ /tmp/xhprof-${XHPROF_VERSION}/extension \ xmlrpc \ xsl \ zip \ # docker-php-ext-install fails after snuffleupagus is enabled /tmp/snuffleupagus-${SNUFFLEUPAGUS_VERSION}/src \ && docker-php-source delete \ && rm /usr/local/etc/php/conf.d/docker-php-ext-* \ && rm -rf /tmp/memcache-* \ && rm -rf /tmp/newrelic-* \ && rm -rf /tmp/snuffleupagus-* \ && rm -rf /tmp/xhprof-* \ && pecl install amqp-${AMQP_VERSION} \ && pecl install apcu-${APCU_VERSION} \ && pecl install ast-${AST_VERSION} \ && pecl install ds-${DS_VERSION} \ && pecl install event-${EVENT_VERSION} \ && pecl install geoip-${GEOIP_VERSION} \ && pecl install grpc-${GRPC_VERSION} \ && pecl install igbinary-${IGBINARY_VERSION} \ && pecl install imagick-${IMAGICK_VERSION} \ && pecl install memcached-${MEMCACHED_VERSION} \ && pecl install mongodb-${MONGODB_VERSION} \ && pecl install oauth-${OAUTH_VERSION} \ && pecl install rar-${RAR_VERSION} \ && pecl install redis-${REDIS_VERSION} \ && echo |pecl install uuid-${UUID_VERSION} \ && pecl install xdebug-${XDEBUG_VERSION} \ && pecl install yaml-${YAML_VERSION} \ && pecl clear-cache \ && runDeps="$( \ scanelf --needed --nobanner --recursive /usr/local \ | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \ | xargs -r apk info --installed \ | sort -u \ )" \ && apk del .build-deps \ && apk add --no-cache --virtual .run-deps $runDeps RUN wget http://gordalina.github.io/cachetool/downloads/cachetool-${CACHETOOL_VERSION}.phar -O /usr/local/bin/cachetool \ && chmod +x /usr/local/bin/cachetool \ && echo -e "\ adapter: fastcgi \n\ fastcgi: 127.0.0.1:9000 \n\ " > /etc/cachetool.yml RUN mkdir -p /etc/ssh && echo -e "\ Host * \n\ Compression yes \n\ " >> /etc/ssh/ssh_config RUN apk add --no-cache \ bash \ bzip2 \ coreutils \ gettext \ git \ imagemagick \ lftp \ mailx \ make \ mysql-client \ nano \ openssh-client \ ssmtp \ vim # Iconv fix: https://github.com/docker-library/php/issues/240#issuecomment-305038173 RUN apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ gnu-libiconv ENV LD_PRELOAD=/usr/lib/preloadable_libiconv.so # builtin modules : Core ctype curl date dom fileinfo filter ftp hash iconv json libxml mbstring mysqlnd openssl pcre PDO pdo_sqlite Phar posix readline Reflection session SimpleXML SPL sqlite3 standard tokenizer xml xmlreader xmlwriter zlib # available modules : amqp apcu ast bcmath blackfire bz2 calendar dba ds enchant event exif gd geoip gmp grpc igbinary imap imagick intl ldap mcrypt memcache memcached mongodb mysqli newrelic oauth opcache pcntl pdo_mysql pdo_pgsql pgsql pspell rar redis shmop snmp snuffleupagus soap sockets sysvmsg sysvsem sysvshm xhprof uuid wddx xdebug xhprof xmlrpc xsl yaml zip ARG PHP_EXT_ENABLE="amqp apcu bcmath bz2 calendar gd geoip imagick intl mcrypt memcached mysqli oauth opcache pdo_mysql redis soap sockets uuid yaml zip" RUN docker-php-ext-enable ${PHP_EXT_ENABLE} # copy *.ini COPY ${DOCKER_BUILD_DIR}/*.ini /usr/local/etc/php/conf.d/ COPY ${DOCKER_BUILD_DIR}/php-fpm-*.conf /usr/local/etc/php-fpm.d/ # custom php config ARG PHP_INI_CONFIG RUN echo -e ${PHP_INI_CONFIG// /\\n} >> /usr/local/etc/php/conf.d/config.ini # custom php cli ARG PHP_CLI_CONFIG="apc.enable_cli=0 max_execution_time=-1 memory_limit=-1 opcache.enable_cli=0 xdebug.default_enable=0" RUN echo '#!/usr/bin/env sh' > /usr/local/bin/php-cli \ && chmod +x /usr/local/bin/php-cli \ && echo -e "\ /usr/local/bin/php -d ${PHP_CLI_CONFIG// / -d } \"\$@\"\ " >> /usr/local/bin/php-cli # install cronlock ADD https://raw.github.com/kvz/cronlock/master/cronlock /usr/bin/cronlock RUN chmod +rx /usr/bin/cronlock # config ssmtp RUN echo "FromLineOverride=YES" >> /etc/ssmtp/ssmtp.conf # https://bugs.php.net/bug.php?id=71880 ENV LOG_STREAM="/tmp/stdout" RUN mkfifo $LOG_STREAM && chmod 777 $LOG_STREAM # default www-data homedir to /var/www for crontabs RUN sed -i 's|/home/www-data|/var/www|' /etc/passwd WORKDIR /var/www # redirect LOG_STREAM to stdout and start php-fpm with environment variables from .env CMD [ "sh", "-c", "(exec 3<>$LOG_STREAM; cat <&3 >&1 & IFS=$'\n'; exec env $(cat .env 2>/dev/null) php-fpm)" ] FROM dist as master ARG UID ARG USER ENV UID=${UID} ENV GID=${UID} ENV USER=${USER} # If we provide a specific UID RUN let $UID >/dev/null 2>&1 \ # Remove user with $UID if it is not our $USER && if [ "$(getent passwd $UID |awk 'BEGIN {FS=":"} {print $1}')" != "$USER" ]; then \ sed -i '/^'$(getent passwd $UID |awk 'BEGIN {FS=":"} {print $1}')':x:'$UID':/d' /etc/passwd; \ sed -i '/^'$(getent group $GID |awk 'BEGIN {FS=":"} {print $1}')':x:'$GID':/d' /etc/group; \ fi \ # Force $UID if our $USER already exists && sed -i 's/^'$USER':x:[0-9]\+:[0-9]\+:/'$USER':x:'$UID':'$GID':/' /etc/passwd \ && sed -i 's/^'$USER':x:[0-9]\+:/'$USER':x:'$GID':/' /etc/group \ # Create $USER if it does not exist && if [ "$(getent passwd $UID)" = "" ]; then \ echo "$USER:x:$UID:$GID::/home/$USER:/bin/false" >> /etc/passwd; \ echo "$USER:!:$(($(date +%s) / 60 / 60 / 24)):0:99999:7:::" >> /etc/shadow; \ echo "$USER:x:$GID:" >> /etc/group; \ fi \ && mkdir -p /home/$USER \ && chown $UID:$GID /home/$USER \ || true RUN chown -R $USER /usr/local/etc/php/conf.d/ USER $USER ARG SSH_REMOTE_HOSTS RUN mkdir -p ~/.ssh \ && ssh-keyscan -t rsa -H $SSH_REMOTE_HOSTS >> ~/.ssh/known_hosts