|
| 1 | +# build: docker build --no-cache --progress=plain --build-arg PHP_VERSION=8.4 -t docker.io/tobi312/php:8.4-dhi-fpm-debian-wsc -f dhi.debian.fpm.wsc.Dockerfile . |
| 2 | +# check: docker run --rm --name phptest -it docker.io/tobi312/php:8.4-dhi-fpm-debian-wsc -m |
| 3 | +# https://hub.docker.com/hardened-images/catalog/dhi/php | short: https://dhi.io/catalog/php |
| 4 | +# https://github.com/docker-hardened-images/catalog |
| 5 | +ARG PHP_VERSION=8.4 |
| 6 | +ARG BUILD_PHP_VERSION=${PHP_VERSION} |
| 7 | +ARG BUILD_OS=debian13 |
| 8 | +# ========================= |
| 9 | +# Stage 1: Build Extensions |
| 10 | +# ========================= |
| 11 | +FROM dhi.io/php:${BUILD_PHP_VERSION}${BUILD_OS:+-${BUILD_OS}}-dev AS builder |
| 12 | +ARG BUILD_PHP_VERSION |
| 13 | + |
| 14 | +WORKDIR /tmp |
| 15 | + |
| 16 | +# Install required system libraries for building PHP extensions |
| 17 | +RUN apt-get update \ |
| 18 | + && apt-get install -y --no-install-recommends \ |
| 19 | + git \ |
| 20 | + unzip \ |
| 21 | + autoconf \ |
| 22 | + build-essential \ |
| 23 | + libjpeg-dev \ |
| 24 | + libpng-dev \ |
| 25 | + libxpm-dev \ |
| 26 | + libfreetype6-dev \ |
| 27 | + libicu-dev \ |
| 28 | + libldap2-dev \ |
| 29 | + libgmp-dev \ |
| 30 | + && apt-get install -y \ |
| 31 | + libmagickwand-dev \ |
| 32 | + && rm -rf /var/lib/apt/lists/* |
| 33 | + |
| 34 | +# ========================= |
| 35 | +# Core PHP Extensions |
| 36 | +# ========================= |
| 37 | + |
| 38 | +# gd |
| 39 | +RUN cd $PHP_SRC_DIR/ext/gd \ |
| 40 | + && phpize \ |
| 41 | + && ./configure --with-webp --with-jpeg --with-xpm --with-freetype \ |
| 42 | + && make -j$(nproc) \ |
| 43 | + && make install |
| 44 | + |
| 45 | +# pdo_mysql |
| 46 | +RUN cd $PHP_SRC_DIR/ext/pdo_mysql \ |
| 47 | + && phpize \ |
| 48 | + && ./configure \ |
| 49 | + && make -j$(nproc) \ |
| 50 | + && make install |
| 51 | + |
| 52 | +# ldap |
| 53 | +RUN cd $PHP_SRC_DIR/ext/ldap \ |
| 54 | + && phpize \ |
| 55 | + && ./configure --with-ldap \ |
| 56 | + && make -j$(nproc) \ |
| 57 | + && make install |
| 58 | + |
| 59 | +# gmp |
| 60 | +RUN cd $PHP_SRC_DIR/ext/gmp \ |
| 61 | + && phpize \ |
| 62 | + && ./configure \ |
| 63 | + && make -j$(nproc) \ |
| 64 | + && make install |
| 65 | + |
| 66 | +# exif |
| 67 | +RUN cd $PHP_SRC_DIR/ext/exif \ |
| 68 | + && phpize \ |
| 69 | + && ./configure \ |
| 70 | + && make -j$(nproc) \ |
| 71 | + && make install |
| 72 | + |
| 73 | +# ========================= |
| 74 | +# PECL Extensions |
| 75 | +# ========================= |
| 76 | +WORKDIR /tmp |
| 77 | + |
| 78 | +# Redis |
| 79 | +RUN pecl download redis \ |
| 80 | + && tar xzf redis-*.tgz \ |
| 81 | + && rm redis-*.tgz \ |
| 82 | + && cd redis-* \ |
| 83 | + && phpize \ |
| 84 | + && ./configure \ |
| 85 | + && make -j$(nproc) \ |
| 86 | + && make install \ |
| 87 | + && cd .. |
| 88 | + |
| 89 | +## Imagick |
| 90 | +#RUN pecl download imagick \ |
| 91 | +# && tar xzf imagick-*.tgz \ |
| 92 | +# && rm imagick-*.tgz \ |
| 93 | +# && cd imagick-* \ |
| 94 | +# && phpize \ |
| 95 | +# && ./configure \ |
| 96 | +# && make -j$(nproc) \ |
| 97 | +# && make install \ |
| 98 | +# && cd .. |
| 99 | + |
| 100 | +# Enable all extensions |
| 101 | +RUN echo "" \ |
| 102 | + && echo "extension=gd.so" > $PHP_INI_DIR/conf.d/gd.ini \ |
| 103 | + && echo "extension=pdo_mysql.so" > $PHP_INI_DIR/conf.d/pdo_mysql.ini \ |
| 104 | + && echo "extension=ldap.so" > $PHP_INI_DIR/conf.d/ldap.ini \ |
| 105 | + && echo "extension=gmp.so" > $PHP_INI_DIR/conf.d/gmp.ini \ |
| 106 | + && echo "extension=exif.so" > $PHP_INI_DIR/conf.d/exif.ini \ |
| 107 | + && echo "extension=redis.so" > $PHP_INI_DIR/conf.d/redis.ini \ |
| 108 | + #&& echo "extension=imagick.so" > $PHP_INI_DIR/conf.d/imagick.ini \ |
| 109 | + && echo "" |
| 110 | + |
| 111 | +## create symlinks |
| 112 | +#RUN ls -lah ${PHP_PREFIX}/lib/php/extensions/no-debug-non-zts-20240924/ \ |
| 113 | +# && mkdir -p /usr/local/lib/php \ |
| 114 | +# && ln -s $(php -r "echo ini_get('extension_dir');") /usr/local/lib/php/extensions \ |
| 115 | +# && ls -lah $PHP_INI_DIR/conf.d/ \ |
| 116 | +# && ln -s $PHP_INI_DIR/conf.d /usr/local/lib/php/conf.d |
| 117 | + |
| 118 | +# ========================= |
| 119 | +# Stage 2: Package extractor |
| 120 | +# ========================= |
| 121 | +# more see: https://github.com/Tob1as/docker-build-example/blob/main/distroless.debian.Dockerfile#L54-L100 |
| 122 | +FROM dhi.io/php:${BUILD_PHP_VERSION}${BUILD_OS:+-${BUILD_OS}}-dev AS deb-extractor |
| 123 | + |
| 124 | +WORKDIR /tmp |
| 125 | +SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
| 126 | + |
| 127 | +# List of packages for download separated by spaces. |
| 128 | +ENV PACKAGE_LIST='libpng16-16t64 libwebp7 libjpeg62-turbo libxpm4 libfreetype6 libbz2-1.0 libsharpyuv0 libx11-6 libxau6 libxcb1 libxdmcp6' |
| 129 | + |
| 130 | +# hadolint ignore=DL3008,DL3015,SC2086 |
| 131 | +RUN \ |
| 132 | + apt-get update && \ |
| 133 | + apt-get install -y apt-rdepends tree && \ |
| 134 | + # Search subpackages for package (apt-rdepends PACKAGE | grep -v "^ " | sort -u | tr '\n' ' ') |
| 135 | + #packages=$(for package in $PACKAGE_LIST; do \ |
| 136 | + # apt-rdepends $package 2>/dev/null | \ |
| 137 | + # grep -v "^ " | \ |
| 138 | + # grep -v "^PreDepends:" | \ |
| 139 | + # sort -u; \ |
| 140 | + #done | sort -u) && \ |
| 141 | + packages=$PACKAGE_LIST ; \ |
| 142 | + # Download packages |
| 143 | + echo ">> Packages to Download: $(echo $packages | tr '\n' ' ')" && \ |
| 144 | + apt-get download \ |
| 145 | + $packages \ |
| 146 | + && \ |
| 147 | + mkdir -p /dpkg/var/lib/dpkg/status.d/ && \ |
| 148 | + for deb in *.deb; do \ |
| 149 | + package_name=$(dpkg-deb -I "${deb}" | awk '/^ Package: .*$/ {print $2}'); \ |
| 150 | + echo "Processing: ${package_name}"; \ |
| 151 | + dpkg --ctrl-tarfile "$deb" | tar -Oxf - ./control > "/dpkg/var/lib/dpkg/status.d/${package_name}"; \ |
| 152 | + dpkg --extract "$deb" /dpkg || exit 10; \ |
| 153 | + done \ |
| 154 | + && \ |
| 155 | + echo "Packages have been processed !" |
| 156 | + |
| 157 | +# Remove unnecessary files extracted from deb packages like man pages and docs etc. |
| 158 | +RUN find /dpkg/ -type d -empty -delete && \ |
| 159 | + rm -r /dpkg/usr/share/doc/ |
| 160 | + |
| 161 | +# List directory and file structure |
| 162 | +#RUN tree /dpkg |
| 163 | + |
| 164 | +# ========================= |
| 165 | +# Stage 3: DHI FPM Image |
| 166 | +# ========================= |
| 167 | +FROM dhi.io/php:${BUILD_PHP_VERSION}${BUILD_OS:+-${BUILD_OS}}-fpm AS production |
| 168 | +ARG BUILD_PHP_VERSION |
| 169 | +LABEL org.opencontainers.image.source="https://github.com/Tob1as/docker-php" |
| 170 | +# Copy php extensions |
| 171 | +COPY --from=builder ${PHP_PREFIX}/lib/php/extensions/ ${PHP_PREFIX}/lib/php/extensions/ |
| 172 | +COPY --from=builder ${PHP_PREFIX}/etc/php/conf.d ${PHP_PREFIX}/etc/php/conf.d |
| 173 | +# Copy the libraries from the extractor stage into root |
| 174 | +COPY --from=deb-extractor /dpkg / |
0 commit comments