|
| 1 | +ARG PHP_VERSION=8.4 |
| 2 | + |
| 3 | +FROM php:${PHP_VERSION}-fpm AS base |
| 4 | + |
| 5 | +# This part installs the required php extensions to compile phalcon. |
| 6 | +# Additional extensions that are mostly used are installed here too. |
| 7 | + |
| 8 | +ARG PHP_VERSION=8.4 |
| 9 | +ARG UID=1000 |
| 10 | +ARG GID=1000 |
| 11 | +ARG USER=phalcon |
| 12 | +ARG GROUP=phalcon |
| 13 | + |
| 14 | +# hadolint ignore=DL3022 |
| 15 | +COPY --from=ghcr.io/mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/ |
| 16 | + |
| 17 | +SHELL [ "/bin/bash", "-o", "pipefail", "-c" ] |
| 18 | + |
| 19 | +RUN set -eux \ |
| 20 | +# Add user and group |
| 21 | + && groupadd -g "${GID}" "${GROUP}" \ |
| 22 | + && useradd -l -u "${UID}" -g "${GID}" -d /app "${USER}" \ |
| 23 | + && usermod -s /bin/bash "${USER}" \ |
| 24 | + && mkdir /app \ |
| 25 | + && chown "${USER}":"${GROUP}" /app \ |
| 26 | + && chmod 0770 /app \ |
| 27 | +# Install base extensions |
| 28 | + && install-php-extensions \ |
| 29 | + apcu \ |
| 30 | + gettext \ |
| 31 | + gd \ |
| 32 | + igbinary \ |
| 33 | + imagick \ |
| 34 | + intl \ |
| 35 | + mysqli \ |
| 36 | + opcache \ |
| 37 | + pdo_mysql \ |
| 38 | + pdo_pgsql \ |
| 39 | + pgsql \ |
| 40 | + redis \ |
| 41 | + xsl \ |
| 42 | + yaml \ |
| 43 | + zip \ |
| 44 | +# Copy ini file \ |
| 45 | + && mv /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini \ |
| 46 | +# Write ini files |
| 47 | + && sed -i -e "s/;error_log = syslog/error_log = \/proc\/self\/fd\/2/" /usr/local/etc/php/php.ini \ |
| 48 | +# Write fpm file |
| 49 | + && sed -i -e "/error_log = .*/c\error_log = \/proc\/self\/fd\/2" /usr/local/etc/php-fpm.conf \ |
| 50 | + && sed -i -e "/;pid = .*/c\pid = /run/php/php-fpm.pid" /usr/local/etc/php-fpm.conf \ |
| 51 | +# Write fpm pool |
| 52 | + && sed -i -e "s/^;clear_env = no$/clear_env = no/" /usr/local/etc/php-fpm.d/www.conf \ |
| 53 | + && sed -i -e "s/;owner = www-data/owner = ${USER}/g" /usr/local/etc/php-fpm.d/www.conf \ |
| 54 | + && sed -i -e "s/;user = www-data/user = ${USER}/g" /usr/local/etc/php-fpm.d/www.conf \ |
| 55 | + && sed -i -e "s/;group = www-data/group = ${GROUP}/g" /usr/local/etc/php-fpm.d/www.conf \ |
| 56 | +# Load healthcheck script \ |
| 57 | + && curl -o /usr/local/bin/php-fpm-healthcheck \ |
| 58 | + https://raw.githubusercontent.com/renatomefi/php-fpm-healthcheck/master/php-fpm-healthcheck \ |
| 59 | + && chown "${USER}":"${GROUP}" /usr/local/bin/php-fpm-healthcheck \ |
| 60 | + && chmod 0770 /usr/local/bin/php-fpm-healthcheck \ |
| 61 | +# Set correct pid file location and permissions \ |
| 62 | + && mkdir -p /run/php \ |
| 63 | + && chown "${USER}":"${GROUP}" /run/php \ |
| 64 | + && chmod 0770 /run/php \ |
| 65 | +# Cleanup |
| 66 | + && apt-get autoremove --purge -y \ |
| 67 | + && apt-get autoclean -y \ |
| 68 | + && apt-get clean -y \ |
| 69 | + && rm -rf /tmp/* /var/tmp/* \ |
| 70 | + && find /var/cache/apt/archives /var/lib/apt/lists -not -name lock -type f -delete \ |
| 71 | + && find /var/cache -type f -delete \ |
| 72 | + && find /var/log -type f -delete |
| 73 | + |
| 74 | +HEALTHCHECK --interval=5s --timeout=1s \ |
| 75 | + CMD php-fpm-healthcheck || exit 1 |
| 76 | + |
| 77 | +FROM base AS dev |
| 78 | + |
| 79 | +# This part prepares a dev environment to compile phalcon from zephir |
| 80 | + |
| 81 | +# hadolint ignore=DL3022 |
| 82 | +COPY --from=composer/composer:2 --chown=${USER}:${GROUP} --chmod=0770 /usr/bin/composer /usr/bin/composer |
| 83 | + |
| 84 | +WORKDIR /srv |
| 85 | + |
| 86 | +SHELL [ "/bin/bash", "-o", "pipefail", "-c" ] |
| 87 | + |
| 88 | +RUN set -eux \ |
| 89 | + && apt-get update \ |
| 90 | + && apt-get install -yq --no-install-recommends zip=3.* unzip=6.* \ |
| 91 | + && echo 'memory_limit = -1' > "$(php-config --ini-dir)/90-memory.ini" \ |
| 92 | + && install-php-extensions zephir_parser \ |
| 93 | +# Cleanup |
| 94 | + && apt-get autoclean -y \ |
| 95 | + && apt-get clean -y \ |
| 96 | + && rm -rf /tmp/* /var/tmp/* |
| 97 | + |
| 98 | +FROM dev AS phalcon |
| 99 | + |
| 100 | +# This part compiles phalcon from zephir code. It should not be used for anything else. |
| 101 | +# It should also not be used as base for anything else. |
| 102 | + |
| 103 | +COPY ./ /srv |
| 104 | + |
| 105 | +RUN set -eux \ |
| 106 | + && rm -rf /srv/vendor \ |
| 107 | + && composer global require phalcon/zephir:dev-development \ |
| 108 | + && /root/.composer/vendor/bin/zephir fullclean \ |
| 109 | + && /root/.composer/vendor/bin/zephir build \ |
| 110 | + && cat compile-errors.log |
| 111 | + |
| 112 | +FROM base AS prod |
| 113 | + |
| 114 | +# This part builds the last step required for production image. |
| 115 | + |
| 116 | +ARG PHALCON_VERSION=5.9.2 |
| 117 | + |
| 118 | +ENV PATH=/app/bin:/app:${PATH} \ |
| 119 | + PHP_VERSION=${PHP_VERSION} \ |
| 120 | + PHALCON_VERSION=${PHALCON_VERSION} |
| 121 | + |
| 122 | +LABEL org.opencontainer.image.title="Phalcon ${PHALCON_VERSION} with php ${PHP_VERSION}" \ |
| 123 | + org.opencontainer.image.description="Docker image including Phalcon and PHP on Debian Bookworm" \ |
| 124 | + org.opencontainer.image.authors="Phalcon Team <team@phalconphp.com>" \ |
| 125 | + org.opencontainer.image.vendor="Phalcon PHP Framework" \ |
| 126 | + org.opencontainer.image.licenses="BSD-3-Clause" \ |
| 127 | + org.opencontainer.image.version="${PHALCON_VERSION}-php${PHP_VERSION}" \ |
| 128 | + org.opencontainer.image.url="https://github.com/phalcon/cphalcon/" \ |
| 129 | + org.opencontainer.image.source="https://github.com/phalcon/cphalcon/tree/${PHALCON_VERSION}/docker/Dockerfile" |
| 130 | + |
| 131 | +COPY --from=phalcon /srv/ext/modules/phalcon.so /tmp/phalcon.so |
| 132 | + |
| 133 | +SHELL [ "/bin/bash", "-o", "pipefail", "-c" ] |
| 134 | + |
| 135 | +RUN set -eux \ |
| 136 | +# Install phalcon \ |
| 137 | + && mv /tmp/phalcon.so "$(php-config --extension-dir)/phalcon.so" \ |
| 138 | + && echo "extension=phalcon.so" > /usr/local/etc/php/conf.d/70-phalcon.ini \ |
| 139 | +# Cleanup |
| 140 | + && rm -rf /tmp/* /var/tmp/* /srv /root/.composer /usr/bin/composer \ |
| 141 | + && apt-get autoremove --purge -y curl \ |
| 142 | + && apt-get autoclean -y \ |
| 143 | + && apt-get clean -y \ |
| 144 | + && rm -rf /tmp/* /var/tmp/* \ |
| 145 | + && find /var/cache/apt/archives /var/lib/apt/lists -not -name lock -type f -delete \ |
| 146 | + && find /var/cache -type f -delete \ |
| 147 | + && find /var/log -type f -delete |
| 148 | + |
| 149 | +WORKDIR /app |
| 150 | + |
| 151 | +USER ${USER} |
0 commit comments