|
| 1 | +# build: docker build --no-cache --progress=plain --build-arg PHP_VERSION=8.4 -t docker.io/tobi312/php:8.4-dhi-fpm-alpine-wsc -f dhi.alpine.fpm.wsc.Dockerfile . |
| 2 | +# check: docker run --rm --name phptest -it docker.io/tobi312/php:8.4-dhi-fpm-alpine-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=alpine3.22 |
| 8 | +# ========================= |
| 9 | +# Stage 0: Build Base Image |
| 10 | +# ========================= |
| 11 | +FROM dhi.io/php:${BUILD_PHP_VERSION}${BUILD_OS:+-${BUILD_OS}}-dev AS dev |
| 12 | +ARG BUILD_PHP_VERSION |
| 13 | + |
| 14 | +# ========================= |
| 15 | +# Stage 1: Build Extensions |
| 16 | +# ========================= |
| 17 | +FROM dev AS builder |
| 18 | +ARG BUILD_PHP_VERSION |
| 19 | + |
| 20 | +WORKDIR /tmp |
| 21 | + |
| 22 | +# Install required system libraries for building PHP extensions |
| 23 | +RUN apk add --no-cache \ |
| 24 | + git \ |
| 25 | + unzip \ |
| 26 | + autoconf \ |
| 27 | + build-base \ |
| 28 | + linux-headers \ |
| 29 | + libjpeg-turbo-dev \ |
| 30 | + libpng-dev \ |
| 31 | + libwebp-dev \ |
| 32 | + libxpm-dev \ |
| 33 | + freetype-dev \ |
| 34 | + icu-dev \ |
| 35 | + openldap-dev \ |
| 36 | + gmp-dev \ |
| 37 | + imagemagick-dev |
| 38 | + |
| 39 | +# ========================= |
| 40 | +# Core PHP Extensions |
| 41 | +# ========================= |
| 42 | + |
| 43 | +# gd |
| 44 | +RUN cd $PHP_SRC_DIR/ext/gd \ |
| 45 | + && phpize \ |
| 46 | + && ./configure --with-webp --with-jpeg --with-xpm --with-freetype \ |
| 47 | + && make -j$(nproc) \ |
| 48 | + && make install |
| 49 | + |
| 50 | +# pdo_mysql |
| 51 | +RUN cd $PHP_SRC_DIR/ext/pdo_mysql \ |
| 52 | + && phpize \ |
| 53 | + && ./configure \ |
| 54 | + && make -j$(nproc) \ |
| 55 | + && make install |
| 56 | + |
| 57 | +# ldap |
| 58 | +RUN cd $PHP_SRC_DIR/ext/ldap \ |
| 59 | + && phpize \ |
| 60 | + && ./configure --with-ldap \ |
| 61 | + && make -j$(nproc) \ |
| 62 | + && make install |
| 63 | + |
| 64 | +# gmp |
| 65 | +RUN cd $PHP_SRC_DIR/ext/gmp \ |
| 66 | + && phpize \ |
| 67 | + && ./configure \ |
| 68 | + && make -j$(nproc) \ |
| 69 | + && make install |
| 70 | + |
| 71 | +# exif |
| 72 | +RUN cd $PHP_SRC_DIR/ext/exif \ |
| 73 | + && phpize \ |
| 74 | + && ./configure \ |
| 75 | + && make -j$(nproc) \ |
| 76 | + && make install |
| 77 | + |
| 78 | +# ========================= |
| 79 | +# PECL Extensions |
| 80 | +# ========================= |
| 81 | +WORKDIR /tmp |
| 82 | + |
| 83 | +# Redis |
| 84 | +RUN pecl download redis \ |
| 85 | + && tar xzf redis-*.tgz \ |
| 86 | + && rm redis-*.tgz \ |
| 87 | + && cd redis-* \ |
| 88 | + && phpize \ |
| 89 | + && ./configure \ |
| 90 | + && make -j$(nproc) \ |
| 91 | + && make install \ |
| 92 | + && cd .. |
| 93 | + |
| 94 | +## Imagick |
| 95 | +RUN pecl download imagick \ |
| 96 | + && tar xzf imagick-*.tgz \ |
| 97 | + && rm imagick-*.tgz \ |
| 98 | + && cd imagick-* \ |
| 99 | + && phpize \ |
| 100 | + && ./configure \ |
| 101 | + && make -j$(nproc) \ |
| 102 | + && make install \ |
| 103 | + && cd .. |
| 104 | + |
| 105 | +# Enable all extensions |
| 106 | +RUN echo "" \ |
| 107 | + && echo "extension=gd.so" > $PHP_INI_DIR/conf.d/gd.ini \ |
| 108 | + && echo "extension=pdo_mysql.so" > $PHP_INI_DIR/conf.d/pdo_mysql.ini \ |
| 109 | + && echo "extension=ldap.so" > $PHP_INI_DIR/conf.d/ldap.ini \ |
| 110 | + && echo "extension=gmp.so" > $PHP_INI_DIR/conf.d/gmp.ini \ |
| 111 | + && echo "extension=exif.so" > $PHP_INI_DIR/conf.d/exif.ini \ |
| 112 | + && echo "extension=redis.so" > $PHP_INI_DIR/conf.d/redis.ini \ |
| 113 | + && echo "extension=imagick.so" > $PHP_INI_DIR/conf.d/imagick.ini \ |
| 114 | + && echo "" |
| 115 | + |
| 116 | +## create symlinks |
| 117 | +#RUN ls -lah ${PHP_PREFIX}/lib/php/extensions/no-debug-non-zts-20240924/ \ |
| 118 | +# && mkdir -p /usr/local/lib/php \ |
| 119 | +# && ln -s $(php -r "echo ini_get('extension_dir');") /usr/local/lib/php/extensions \ |
| 120 | +# && ls -lah $PHP_INI_DIR/conf.d/ \ |
| 121 | +# && ln -s $PHP_INI_DIR/conf.d /usr/local/lib/php/conf.d |
| 122 | + |
| 123 | +# ========================= |
| 124 | +# Stage 2: Package extractor |
| 125 | +# ========================= |
| 126 | +# more see: https://github.com/Tob1as/docker-build-example/blob/main/distroless.debian.Dockerfile#L54-L100 |
| 127 | +FROM dev AS apk-extractor |
| 128 | + |
| 129 | +WORKDIR /tmp |
| 130 | +SHELL ["/bin/sh", "-o", "pipefail", "-c"] |
| 131 | + |
| 132 | +# List of packages for download separated by spaces. (Helpful: https://pkgs.alpinelinux.org/contents) |
| 133 | +ENV PACKAGE_LIST_LDAP='libldap libsasl' |
| 134 | +ENV PACKAGE_LIST_GD="gmp libpng libwebp libjpeg-turbo freetype libsharpyuv libxpm libx11 libbz2 libxcb libxau libxdmcp libbsd libmd" |
| 135 | +ENV PACKAGE_LIST_IMAGICK="libgomp imagemagick-libs lcms2 fftw-double-libs fontconfig libxext libltdl libexpat" |
| 136 | +ENV PACKAGE_LIST="${PACKAGE_LIST_LDAP} ${PACKAGE_LIST_GD} ${PACKAGE_LIST_IMAGICK}" |
| 137 | + |
| 138 | +# hadolint ignore=DL3008,DL3015,SC2086 |
| 139 | +RUN \ |
| 140 | + #apk fetch --no-cache --recursive $PACKAGE_LIST && \ |
| 141 | + apk fetch --no-cache $PACKAGE_LIST && \ |
| 142 | + mkdir -p /apkroot && \ |
| 143 | + for pkg in *.apk; do \ |
| 144 | + tar -xzf "$pkg" -C /apkroot; \ |
| 145 | + done && \ |
| 146 | + echo "Packages have been processed !" |
| 147 | + |
| 148 | +# List directory and file structure |
| 149 | +#RUN tree /apkroot |
| 150 | + |
| 151 | +# Remove unnecessary files extracted from apk packages like man pages and docs etc. |
| 152 | +#RUN rm -rf \ |
| 153 | +# /apkroot/usr/share/man \ |
| 154 | +# /apkroot/usr/share/doc \ |
| 155 | +# /apkroot/usr/share/info |
| 156 | + |
| 157 | +# Remove other not needed folder and files ? |
| 158 | +RUN find /apkroot -mindepth 1 \ |
| 159 | + ! -path '/apkroot/usr' \ |
| 160 | + ! -path '/apkroot/usr/lib' \ |
| 161 | + ! -path '/apkroot/usr/lib/*' \ |
| 162 | + -exec rm -rf {} + |
| 163 | + |
| 164 | +# List directory and file structure |
| 165 | +RUN tree /apkroot |
| 166 | + |
| 167 | +# ========================= |
| 168 | +# Stage 3: DHI FPM Image |
| 169 | +# ========================= |
| 170 | +FROM dhi.io/php:${BUILD_PHP_VERSION}${BUILD_OS:+-${BUILD_OS}}-fpm AS production |
| 171 | +ARG BUILD_PHP_VERSION |
| 172 | +#ARG BUILD_OS |
| 173 | +ARG VCS_REF |
| 174 | +ARG BUILD_DATE |
| 175 | +LABEL org.opencontainers.image.authors="Tobias Hargesheimer <docker@ison.ws>" \ |
| 176 | + org.opencontainers.image.title="DHI PHP-FPM for WSC" \ |
| 177 | + org.opencontainers.image.description="DHI (Docker Hardened Images): Alpine with PHP-FPM ${BUILD_PHP_VERSION} for WSC (WoltLab Suite Core)" \ |
| 178 | + org.opencontainers.image.created="${BUILD_DATE}" \ |
| 179 | + org.opencontainers.image.revision="${VCS_REF}" \ |
| 180 | + org.opencontainers.image.licenses="Apache-2.0" \ |
| 181 | + org.opencontainers.image.url="https://hub.docker.com/r/tobi312/php" \ |
| 182 | + org.opencontainers.image.source="https://github.com/Tob1as/docker-php" |
| 183 | +# Copy php extensions |
| 184 | +COPY --from=builder ${PHP_PREFIX}/lib/php/extensions/ ${PHP_PREFIX}/lib/php/extensions/ |
| 185 | +COPY --from=builder ${PHP_PREFIX}/etc/php/conf.d ${PHP_PREFIX}/etc/php/conf.d |
| 186 | +# Copy the libraries from the extractor stage into root |
| 187 | +COPY --from=apk-extractor /apkroot / |
0 commit comments