Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 153 additions & 0 deletions images/Dockerfile-dev-8.3-cli-bookworm
Original file line number Diff line number Diff line change
@@ -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"]
29 changes: 29 additions & 0 deletions images/etc/docker-entrypoint-ci.sh
Original file line number Diff line number Diff line change
@@ -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 "$@"