0

I want to dockerize a PHP application locally that has multiple extensions. Whenever I pull the image which is php:7.3.29-apache I should install each extension one by one so it can match the environment where the application is actually running. The real issue is the time, it took me a half hour for installing all the required extensions. I failed every Dockerfile attempt to install all the extensions in one command.

This is my docker-compose File :

version: "4"

services:
  db:
    image: mysql:8.0.30
    container_name: mysql
    ports:
      - "3308:3306"
    environment:
      MYSQL_DATABASE: dbname
      MYSQL_USER: dbusername
      MYSQL_PASSWORD: dbpassword
      MYSQL_ROOT_PASSWORD: rootpassword
  web:
    image: php:7.3.29-apache
    container_name: phpapache
    ports:
      - "80:80"
    volumes:
      - ./php:/var/www/html
    depends_on:
      - db

The extensions that I want to install :

Apcu,  bcmath,  bz2,  calendar,  core,  ctype,  curl,  date,  dom,  exif,  fileinfo,  filter,  ftp,  gd,  gettext,  gmp,  hash,  iconv,  igbinary,  intl,  json,  ldap,  libxml,  mbstring,  memcached,  msgpack,  mysqli,  mysqlnd,  openssl,  pcntl,  pcre,  pdo,  pdo_mysql,  pdo_pgsql,  pdo_sqlite,  pgsql,  phar,  posix,  rdkafka,  readline,  reflection,  session,  shmop,  simplexml,  soap,  sockets,  spl,  sqlite3,  standard,  sysvmsg,  sysvsem,  sysvshm,  tokenizer,  wddx,  xml,  xmlreader,  xmlwriter,  xsl,  zend,  opcache,  zip,  zlib

Finally, this is how I install manually every extension one by one from Docker desktop terminal :

#run seprately every cmd to make sure you install all extentions correctly
#gettext
docker-php-ext-install gettext;
#mysqli
docker-php-ext-install mysqli;
#bcmath
docker-php-ext-install bcmath;
#sockets
docker-php-ext-install sockets;
#sysvmsg
docker-php-ext-install sysvmsg;
#sysvsem
docker-php-ext-install sysvsem;
#sysvshm
docker-php-ext-install sysvshm;
#pcntl
docker-php-ext-install pcntl;
#shmop
docker-php-ext-install shmop;
#opcache
docker-php-ext-install opcache;
#calndar
docker-php-ext-configure calendar && docker-php-ext-install calendar;
#pdo_mysql
docker-php-ext-install pdo_mysql && docker-php-ext-enable pdo_mysql;
#rdkafka
apt-get update && apt-get install -y librdkafka-dev;
pecl install rdkafka;
echo "extension=rdkafka.so" > /usr/local/etc/php/conf.d/rdkafka.ini;
#zip
apt-get update && apt-get install -y libzip-dev; docker-php-ext-install zip;
#bz2
apt-get update && apt-get install -y libbz2-dev;
docker-php-ext-install bz2;
#apcu
pecl install apcu;
echo "extension=apcu.so" > /usr/local/etc/php/conf.d/apcu.ini;
#exif
docker-php-ext-install exif;
#gd
apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libwebp-dev libxpm-dev; docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp --with-xpm; docker-php-ext-install gd;
#gmp
apt-get update && apt-get install -y libgmp-dev; docker-php-ext-install gmp;
#igbinary
pecl install igbinary; 
echo "extension=igbinary.so" > /usr/local/etc/php/conf.d/igbinary.ini;
#intl
apt-get update && apt-get install -y libicu-dev; docker-php-ext-install intl;
#ldap
apt-get update && apt-get install -y libldap2-dev; docker-php-ext-install ldap;
#memcached
apt-get update && apt-get install -y libmemcached-dev; pecl install memcached;
echo "extension=memcached.so" > /usr/local/etc/php/conf.d/memcached.ini
#msgpack
pecl install msgpack;
echo "extension=msgpack.so" > /usr/local/etc/php/conf.d/msgpack.ini;
#pdo_pgsql
apt-get update && apt-get install -y libpq-dev; docker-php-ext-install pdo_pgsql;
#pgsql
apt-get update && apt-get install -y libpq-dev; docker-php-ext-install pgsql;
#soap
apt-get update && apt-get install -y libxml2-dev; docker-php-ext-install soap;
#wddx
docker-php-ext-install wddx
#xsl
apt-get update && apt-get install -y libxslt1-dev; docker-php-ext-install xsl;
#install composer
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer 
MimoudiX
  • 612
  • 3
  • 16
  • Surely you don't need all those extensions. – Alex Howansky Apr 26 '23 at 14:20
  • @AlexHowansky Sure I do, it's one of my tasks during an internship – MimoudiX Apr 26 '23 at 14:36
  • Those extensions might be installed on your production server but your app does not use them all. You can probably safely remove 90% of them. Start with just mysqli, build the container, try to run the app. If it fails with an error about "missing function xyz()" then that will tell you which extension you're missing. – Alex Howansky Apr 26 '23 at 14:45
  • Does this help https://stackoverflow.com/questions/37527803/how-to-install-extension-for-php-via-docker-php-ext-install – RiggsFolly Apr 26 '23 at 17:11
  • @RiggsFolly sadly no, but I did find a solution it's below. – MimoudiX Apr 27 '23 at 13:26

1 Answers1

0

I used the a docker PHP extension installer script from "mlocati/docker-php-extension-installer" repository

This answers my question :

FROM php:7.3.29-apache

ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

RUN chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions apcu bcmath bz2 calendar core ctype curl date dom exif fileinfo filter ftp gd gettext gmp igbinary pcntl intl pdo_mysql pdo_pgsql pgsql sysvmsg sysvsem sysvshm ldap mysqli rdkafka soap sockets soap zip wddx opcache xsl shmop msgpack memcached
MimoudiX
  • 612
  • 3
  • 16