github.com/ddev/ddev@v1.23.2-0.20240519125000-d824ffe36ff3/containers/ddev-php-base/Dockerfile (about)

     1  ### ---------------------------base--------------------------------------
     2  ### Build the base Debian image that will be used in every other image
     3  FROM debian:bookworm-slim as base
     4  
     5  RUN ls -l $(which dpkg-split) && ls -l $(which dpkg-deb)
     6  RUN for item in dpkg-split dpkg-deb; do \
     7    if [ ! -f /usr/sbin/$item ]; then \
     8      ln -sf /usr/bin/$item /usr/sbin/$item; \
     9    fi; \
    10  done
    11  RUN for item in tar rm; do \
    12    if [ ! -f /usr/sbin/$item ]; then \
    13      ln -sf /bin/$item /usr/sbin/$item; \
    14    fi; \
    15  done
    16  
    17  RUN ls -l /usr/sbin/dpkg-split /usr/sbin/dpkg-deb /usr/sbin/tar /usr/sbin/rm
    18  
    19  RUN apt-get -qq update
    20  RUN apt-get -qq install --no-install-recommends --no-install-suggests -y \
    21      apt-transport-https \
    22      ca-certificates \
    23      bzip2 \
    24      curl \
    25      git \
    26      gnupg \
    27      less \
    28      lsb-release \
    29      procps \
    30      tree \
    31      vim \
    32      wget
    33  #END base
    34  
    35  ### ---------------------------ddev-xdebug-build--------------------------------------
    36  ### Xdebug compile specific version because 3.3 is not fully reliable
    37  ### See https://github.com/ddev/ddev/issues/6159
    38  ### We don't need to recompile every Xdebug library https://xdebug.org/docs/compat (only PHP 8.0, 8.1, 8.2 can have Xdebug 3.2)
    39  ### PECL does not allow you to install multiple versions of Xdebug, so there is `rm -f xdebug.reg`
    40  FROM base as ddev-xdebug-build
    41  SHELL ["/bin/bash", "-c"]
    42  RUN curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb && \
    43      dpkg -i /tmp/debsuryorg-archive-keyring.deb && rm -f /tmp/debsuryorg-archive-keyring.deb && \
    44      echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list && apt-get update
    45  ARG XDEBUG_VERSION="3.2.2"
    46  ARG XDEBUG_BUILD_PACKAGES="build-essential php-pear php8.0-dev php8.1-dev php8.2-dev"
    47  RUN set -eu -o pipefail; \
    48      apt-get -qq update && \
    49      apt-get -qq install --no-install-recommends --no-install-suggests -y ${XDEBUG_BUILD_PACKAGES}
    50  RUN pecl channel-update pecl.php.net && \
    51      for version in 8.0 8.1 8.2; do \
    52          (apt-get -qq remove -y php${version}-xdebug || true) && \
    53          pecl -d php_suffix=${version} install -f xdebug-${XDEBUG_VERSION} && \
    54          rm -f /usr/share/php/.registry/.channel.pecl.php.net/xdebug.reg || exit $?; \
    55      done
    56  #END ddev-xdebug-build
    57  
    58  ### ---------------------------ddev-php-base--------------------------------------
    59  ### Build ddev-php-base, which is the base for ddev-php-prod and ddev-webserver-*
    60  ### This combines the packages and features of DDEV’s ddev-webserver and PHP image
    61  FROM base AS ddev-php-base
    62  ARG PHP_DEFAULT_VERSION="8.2"
    63  ENV DDEV_PHP_VERSION=$PHP_DEFAULT_VERSION
    64  ENV PHP_VERSIONS="php5.6 php7.0 php7.1 php7.2 php7.3 php7.4 php8.0 php8.1 php8.2 php8.3"
    65  ENV PHP_INI=/etc/php/$PHP_DEFAULT_VERSION/fpm/php.ini
    66  ENV YQ_VERSION=v4.30.5
    67  ENV DRUSH_VERSION=8.4.12
    68  ENV NODE_VERSION=20
    69  # composer normally screams about running as root, we don't need that.
    70  ENV COMPOSER_ALLOW_SUPERUSER 1
    71  ENV COMPOSER_PROCESS_TIMEOUT 2000
    72  
    73  # TARGETPLATFORM is Docker buildx's target platform (e.g. linux/arm64), while
    74  # BUILDPLATFORM is the platform of the build host (e.g. linux/amd64)
    75  ARG TARGETPLATFORM
    76  ARG BUILDPLATFORM
    77  
    78  SHELL ["/bin/bash", "-c"]
    79  
    80  RUN curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    81          | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
    82  RUN echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
    83  http://nginx.org/packages/debian `lsb_release -cs` nginx" > /etc/apt/sources.list.d/nginx.list
    84  
    85  RUN curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb && \
    86      dpkg -i /tmp/debsuryorg-archive-keyring.deb && rm -f /tmp/debsuryorg-archive-keyring.deb && \
    87      echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list && apt-get update
    88  RUN curl -sSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg && \
    89      echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_VERSION.x nodistro main" > /etc/apt/sources.list.d/nodesource.list
    90  
    91  RUN apt-get -qq update
    92  RUN apt-get -qq install --no-install-recommends --no-install-suggests -y \
    93      apache2 \
    94      file \
    95      ghostscript \
    96      imagemagick \
    97      gunicorn \
    98      graphicsmagick \
    99      jq \
   100      mariadb-client \
   101      msmtp \
   102      nginx \
   103      nodejs \
   104      postgresql-client \
   105      sqlite3
   106  
   107  RUN npm install --unsafe-perm=true --global gulp-cli yarn
   108  # Normal user needs to be able to write to php sessions
   109  RUN set -eu -o pipefail && LATEST=$(curl -L --fail --silent "https://api.github.com/repos/nvm-sh/nvm/releases/latest" | jq -r .tag_name) && curl --fail -sL https://raw.githubusercontent.com/nvm-sh/nvm/${LATEST}/install.sh -o /usr/local/bin/install_nvm.sh && chmod +x /usr/local/bin/install_nvm.sh
   110  
   111  # The number of permutations of php packages available on each architecture because
   112  # too much to handle, so has been codified here instead of in obscure logic
   113  ENV php56_amd64="apcu bcmath bz2 curl cli common fpm gd imagick intl json ldap mbstring mcrypt memcached mysql opcache pgsql readline redis soap sqlite3 uploadprogress xdebug xhprof xml xmlrpc zip"
   114  ENV php56_arm64="apcu bcmath bz2 curl cli common fpm gd imagick intl json ldap mbstring mcrypt mysql opcache pgsql readline soap sqlite3 uploadprogress xdebug xml xhprof xmlrpc zip"
   115  ENV php70_amd64="apcu apcu-bc bcmath bz2 curl cli common fpm gd imagick intl json ldap mbstring mcrypt memcached mysql opcache pgsql readline redis soap sqlite3 uploadprogress xdebug xhprof xml xmlrpc zip"
   116  ENV php70_arm64=$php70_amd64
   117  ENV php71_amd64=$php70_amd64
   118  ENV php71_arm64=$php70_arm64
   119  ENV php72_amd64="apcu apcu-bc bcmath bz2 curl cli common fpm gd imagick intl json ldap mbstring memcached mysql opcache pgsql readline redis soap sqlite3 uploadprogress xdebug xhprof xml xmlrpc zip"
   120  ENV php72_arm64=$php72_amd64
   121  ENV php73_amd64=$php72_amd64
   122  ENV php73_arm64=$php72_arm64
   123  ENV php74_amd64="apcu apcu-bc bcmath bz2 curl cli common fpm gd imagick intl json ldap mbstring memcached mysql opcache pgsql readline redis soap sqlite3 uploadprogress xdebug xhprof xml xmlrpc zip"
   124  ENV php74_arm64=$php74_amd64
   125  
   126  # As of php8.0 json is now part of core package and xmlrpc has been removed from PECL
   127  ENV php80_amd64="apcu bcmath bz2 curl cli common fpm gd imagick intl ldap mbstring memcached mysql opcache pgsql readline redis soap sqlite3 uploadprogress xdebug xhprof xml xmlrpc zip"
   128  ENV php80_arm64=$php80_amd64
   129  
   130  ENV php81_amd64=$php80_amd64
   131  ENV php81_arm64=$php81_amd64
   132  ENV php82_amd64=$php81_amd64
   133  ENV php82_arm64=$php82_amd64
   134  ENV php83_amd64=$php82_amd64
   135  ENV php83_arm64=$php83_amd64
   136  
   137  RUN for v in $PHP_VERSIONS; do \
   138      targetarch=${TARGETPLATFORM#linux/}; \
   139      pkgvar=${v//.}_${targetarch}; \
   140      pkgs=$(echo ${!pkgvar} | awk -v v="$v" ' BEGIN {RS=" "; }  { printf "%s-%s ",v,$0 ; }' ); \
   141      [[ ${pkgs// } != "" ]] && (apt-get -qq install --no-install-recommends --no-install-suggests -y $pkgs || exit $?) \
   142  done
   143  ### ---------------------------ddev-xdebug-build--------------------------------------
   144  ### The dates from /usr/lib/php/YYYYMMDD/ represent PHP API versions https://unix.stackexchange.com/a/591771
   145  RUN apt-get -qq remove -y php8.0-xdebug php8.1-xdebug php8.2-xdebug
   146  COPY --from=ddev-xdebug-build /usr/lib/php/20200930/xdebug.so /usr/lib/php/20200930/xdebug.so
   147  COPY --from=ddev-xdebug-build /usr/lib/php/20210902/xdebug.so /usr/lib/php/20210902/xdebug.so
   148  COPY --from=ddev-xdebug-build /usr/lib/php/20220829/xdebug.so /usr/lib/php/20220829/xdebug.so
   149  #END ddev-xdebug-build
   150  RUN phpdismod xhprof
   151  RUN apt-get -qq autoremove -y
   152  RUN curl -L --fail -o /usr/local/bin/composer -sSL https://getcomposer.org/composer-stable.phar && chmod ugo+wx /usr/local/bin/composer
   153  RUN curl -L --fail -sSL "https://github.com/drush-ops/drush/releases/download/${DRUSH_VERSION}/drush.phar" -o /usr/local/bin/drush8 && chmod +x /usr/local/bin/drush8
   154  RUN curl --fail -sSL -o /usr/local/bin/wp-cli -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && chmod +x /usr/local/bin/wp-cli && ln -sf /usr/local/bin/wp-cli /usr/local/bin/wp
   155  RUN url="https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/yq_linux_${TARGETPLATFORM#linux/}"; wget ${url} -O /usr/bin/yq && chmod +x /usr/bin/yq
   156  ADD ddev-php-files /
   157  RUN apt-get -qq autoremove && apt-get -qq clean -y && rm -rf /var/lib/apt/lists/* /tmp/*
   158  RUN ln -sf /usr/sbin/php-fpm${DDEV_PHP_VERSION} /usr/sbin/php-fpm
   159  RUN mkdir -p /run/php && chown -R www-data:www-data /run
   160  RUN chmod 777 /var/lib/php/sessions
   161  #END ddev-php-base
   162  
   163  ### ---------------------------ddev-php-prod--------------------------------------
   164  ### Build ddev-php-prod from ddev-php-base as a single layer
   165  ### There aren't any differences
   166  FROM scratch AS ddev-php-prod
   167  COPY --from=ddev-php-base / /
   168  EXPOSE 8080 8585
   169  CMD ["/usr/sbin/php-fpm", "-F"]
   170  #END ddev-php-prod