From 0bca237ffbf6fea4fd695a3fb6bfcce9e14e53ae Mon Sep 17 00:00:00 2001 From: Vladislav Repka Date: Fri, 31 Oct 2025 15:30:53 +0200 Subject: [PATCH] =?UTF-8?q?MOCO-14409=20[perf]=20[test]=20=D0=94=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=20php8.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- images/Dockerfile-dev-8.3-cli-bookworm | 153 +++++++++++++++++++++++++ images/etc/docker-entrypoint-ci.sh | 29 +++++ 2 files changed, 182 insertions(+) create mode 100644 images/Dockerfile-dev-8.3-cli-bookworm create mode 100644 images/etc/docker-entrypoint-ci.sh diff --git a/images/Dockerfile-dev-8.3-cli-bookworm b/images/Dockerfile-dev-8.3-cli-bookworm new file mode 100644 index 0000000..d9451fb --- /dev/null +++ b/images/Dockerfile-dev-8.3-cli-bookworm @@ -0,0 +1,153 @@ +# Moco Dockerfile for PHP 8.3 CLI + +FROM php:8.3-cli-bookworm + +ENV TZ=Europe/Kyiv +ENV PATH="/home/composer/.composer/vendor/bin:${PATH}" +ENV COMPOSER_HOME=/home/composer/.composer +ENV COMPOSER_ALLOW_SUPERUSER=1 +ENV DEBIAN_FRONTEND=noninteractive + +# Add user for application early so chown/su in later steps works +RUN groupadd -g 1000 www +RUN useradd -u 1000 -ms /bin/bash -g www www +RUN mkdir -p ${COMPOSER_HOME} && chown -R www:www ${COMPOSER_HOME} + +# Set locale (keep same behaviour as 8.3-fpm) +RUN apt-get update && apt-get install -y locales && \ + sed -i -e 's/# uk_UA.UTF-8 UTF-8/uk_UA.UTF-8 UTF-8/' /etc/locale.gen && \ + dpkg-reconfigure --frontend=noninteractive locales && update-locale LANG=uk_UA.UTF-8 +ENV LANG=uk_UA.UTF-8 + +# Install build deps, runtime libs and compile core PHP extensions +RUN set -ex \ + && apt-get -qq update \ + && ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone \ + && apt-get -qq install -y --no-install-recommends \ + ca-certificates \ + curl \ + git \ + unzip \ + zip \ + gnupg \ + dirmngr \ + default-mysql-client \ + build-essential \ + autoconf \ + pkg-config \ + libfreetype6-dev \ + libjpeg62-turbo-dev \ + libpng-dev \ + libzip-dev \ + libxml2-dev \ + libxslt-dev \ + libicu-dev \ + libmcrypt-dev \ + libonig-dev \ + libmagickwand-dev \ + imagemagick \ + libldap2-dev \ + mc \ + vim \ + rsync \ + nano \ + # ensure runtime libraries remain available after we remove -dev packages \ + libzip4 \ + libxml2 \ + libxslt1.1 \ + libmcrypt4 \ + libldap-2.5-0 \ + && docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg \ + && docker-php-ext-install -j$(nproc) \ + gd \ + pdo_mysql \ + mysqli \ + bcmath \ + zip \ + soap \ + opcache \ + xsl \ + intl \ + mbstring \ + exif \ + ldap + +# Install PECL extensions (separate step for easier debugging) +RUN set -ex \ + && mkdir -p /tmp/pear && chmod -R 0777 /tmp/pear || true \ + && export TMPDIR=/tmp/pear \ + && pecl -vvv install channel://pecl.php.net/xmlrpc-1.0.0RC3 || true \ + && pecl -vvv install mcrypt-1.0.7 || pecl -vvv install mcrypt-1.0.2 || true \ + && pecl -vvv install imagick \ + && (pecl -vvv install xdebug-3.3.1 || pecl -vvv install xdebug) \ + && pecl -vvv install apcu \ + && docker-php-ext-enable mcrypt imagick apcu xdebug || true + +# Ensure PECL-installed extensions are enabled with proper ini files (xdebug needs zend_extension) +RUN set -ex \ + && EXT_DIR=$(php -r 'echo ini_get("extension_dir");') \ + && if [ -f "${EXT_DIR}/xdebug.so" ]; then \ + echo "zend_extension=${EXT_DIR}/xdebug.so" > /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \ + echo "xdebug.mode=off" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \ + chown www:www /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \ + chmod 664 /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \ + fi \ + && if [ -f "${EXT_DIR}/xmlrpc.so" ]; then \ + echo "extension=xmlrpc.so" > /usr/local/etc/php/conf.d/docker-php-ext-xmlrpc.ini; \ + chown www:www /usr/local/etc/php/conf.d/docker-php-ext-xmlrpc.ini; \ + chmod 664 /usr/local/etc/php/conf.d/docker-php-ext-xmlrpc.ini; \ + fi + +# Composer global tools and cleanup (separate step) +RUN set -ex \ + && curl -sS https://getcomposer.org/installer -o composer-setup.php \ + && php composer-setup.php --install-dir=/usr/local/bin --filename=composer --quiet \ + && rm -f composer-setup.php \ + && su -s /bin/sh -c "composer global require --no-interaction --prefer-dist --optimize-autoloader codeception/codeception:^5 codeception/module-db codeception/module-asserts" www || true \ + && curl --insecure -OL https://github.com/koalaman/shellcheck/releases/download/stable/shellcheck-stable.linux.x86_64.tar.xz \ + && tar -xvf shellcheck-stable.linux.x86_64.tar.xz \ + && mv shellcheck-stable/shellcheck /usr/local/bin/shellcheck \ + && rm -fr shellcheck-stable shellcheck-stable.linux.x86_64.tar.xz \ + && git clone --depth 1 https://github.com/sstephenson/bats.git /tmp/bats \ + && cd /tmp/bats && ./install.sh /usr/local && rm -rf /tmp/bats \ + && curl --fail --location https://github.com/mvdan/sh/releases/download/v2.6.3/shfmt_v2.6.3_linux_amd64 -o /usr/local/bin/shfmt \ + && chmod +x /usr/local/bin/shfmt \ + && if [ -f /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini ]; then \ + echo "; disabled by default for CI" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \ + echo "xdebug.mode=off" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \ + else \ + echo "; disabled by default for CI" > /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \ + echo "xdebug.mode=off" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \ + fi \ + && apt-get -qq remove -y --purge \ + libfreetype6-dev \ + libjpeg62-turbo-dev \ + libpng-dev \ + libzip-dev \ + libxml2-dev \ + libxslt-dev \ + libicu-dev \ + libmcrypt-dev \ + libonig-dev \ + libmagickwand-dev \ + libldap2-dev \ + build-essential \ + autoconf \ + pkg-config \ + && apt-get clean \ + && pecl clear-cache || true \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /tmp/pear || true \ + && composer clear-cache || true + +WORKDIR /project + +# Expose helper: enable xdebug at runtime by passing --env ENABLE_XDEBUG=1 +# Entrypoint will toggle xdebug if requested +COPY --chown=www:www etc/docker-entrypoint-ci.sh /usr/local/bin/docker-entrypoint-ci.sh +RUN chmod +x /usr/local/bin/docker-entrypoint-ci.sh + +USER www + +# Default command for interactive debugging; CI will override command +ENTRYPOINT ["/usr/local/bin/docker-entrypoint-ci.sh"] +CMD ["php", "-v"] diff --git a/images/etc/docker-entrypoint-ci.sh b/images/etc/docker-entrypoint-ci.sh new file mode 100644 index 0000000..adbb077 --- /dev/null +++ b/images/etc/docker-entrypoint-ci.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env sh + +set -e + +# docker-entrypoint for CI/CLI image +# - allow enabling xdebug at runtime via ENABLE_XDEBUG=1 +# - if first arg looks like an option (starts with -) prepend php + +# Enable xdebug at runtime if requested +if [ "${ENABLE_XDEBUG:-0}" = "1" ]; then + if [ -f /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini ]; then + echo "Enabling xdebug" + # Use a safe edit method: sed -> temp in /tmp, then overwrite file. + # This avoids sed creating a temp file in the target directory (which requires directory write permission). + TMPF=$(mktemp /tmp/docker-php-xdebug.XXXXXX) || TMPF=/tmp/docker-php-xdebug.$$ + if sed 's/^xdebug.mode=off/xdebug.mode=coverage/' /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini > "$TMPF"; then + # Overwrite the original file (requires write permission to the file itself) + cat "$TMPF" > /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini || true + fi + rm -f "$TMPF" || true + fi +fi + +# first arg is an option (e.g. -v) -> prepend php +if [ "${1#-}" != "$1" ]; then + set -- php "$@" +fi + +exec "$@"