Best way to install php extensions, like intl un docker container

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • criffoh
    Member
    • Jun 2020
    • 60

    #1

    Best way to install php extensions, like intl un docker container

    I've installed the latest Espo in Ubuntu with docker, and I need install php-intl. What is the best way to do this?

    Could a custom Dockerfile be used for this?
  • jamie
    Senior Member
    • Aug 2025
    • 298

    #2
    yup dockerfile is the way todo this here is an example of my dockerfile

    Code:
    FROM php:8.4-apache
    # Copy Composer from the official Composer image
    COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
    # Install system dependencies
    RUN apt-get update && apt-get install -y --no-install-recommends \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libzip-dev \
    exif \
    unzip \
    git \
    libzmq3-dev \
    pkg-config \
    netcat-openbsd \
    cron \
    fonts-dejavu-core \
    fonts-dejavu-extra \
    libmagickwand-dev
    # PHP extensions
    RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install gd zip exif pdo pdo_mysql pcntl posix
    # Install Imagick
    RUN pecl install imagick \
    && docker-php-ext-enable imagick
    # ZMQ extension (with fallback manual build)
    RUN pecl install zmq || ( \
    git clone https://github.com/zeromq/php-zmq.git /tmp/php-zmq && \
    cd /tmp/php-zmq && phpize && ./configure && make && make install \
    ) && docker-php-ext-enable zmq
    # uncomment when in final production
    # RUN apt-get clean && rm -rf /var/lib/apt/lists/*
    RUN echo "* * * * * cd /var/www/html; /usr/local/bin/php -f cron.php > /dev/null 2>&1" | crontab -u www-data -
    RUN a2enmod rewrite
    WORKDIR /var/www/html
    COPY . /var/www/html/
    COPY docker/apache.cnf /etc/apache2/sites-available/espocrm.conf
    RUN a2dissite 000-default.conf \
    && a2ensite espocrm.conf
    COPY docker/apache-timeout.conf /etc/apache2/conf-available/timeout.conf
    RUN a2enconf timeout.conf
    RUN mkdir -p /var/www/html/data/cache/application/acl \
    && mkdir -p /var/www/html/data/cache/application/aclMap \
    && mkdir -p /var/www/html/data/logs
    RUN chown -R www-data:www-data /var/www/html \
    && chmod -R 755 /var/www/html
    RUN echo "memory_limit = 1024M" > /usr/local/etc/php/conf.d/memory-limit.ini

    Comment


    • criffoh
      criffoh commented
      Editing a comment
      Thank! I'm going to test it
  • jamie
    Senior Member
    • Aug 2025
    • 298

    #3
    is very customized to my needs so you may want to remove some items

    Comment

    • jamie
      Senior Member
      • Aug 2025
      • 298

      #4
      you might also want to see my composer file, this use a .env file where you see ${WORD}, and no I won't be sharing here


      Code:
      services:
      db:
      image: mariadb:latest
      container_name: ${CONTAINER_NAME}-db
      restart: unless-stopped
      environment:
      TZ: Europe/London
      MARIADB_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MARIADB_USER: ${DB_USER}
      MARIADB_PASSWORD: ${DB_PASSWORD}
      MARIADB_DATABASE: ${DB_DATABASE}
      volumes:
      - db-data:/var/lib/mysql
      - mysql-logs:/var/log/mysql
      - ./docker/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
      - ./docker/mysql.cnf:/etc/mysql/conf.d/my_custom.cnf:ro
      #- ./my-debug.cnf:/etc/mysql/conf.d/my.cnf
      healthcheck:
      test: [ "CMD", "healthcheck.sh", "--connect", "--innodb_initialized" ]
      interval: 20s
      start_period: 10s
      timeout: 10s
      retries: 3
      ports:
      - "${DB_PORT:-3307}:3306"
      expose:
      - "${DB_PORT:-3307}"
      logging:
      driver: json-file
      options:
      max-size: "10m"
      max-file: "3"
      networks:
      - espocrm-net
      app:
      build: .
      image: ${CONTAINER_NAME}:latest
      command: apache2-foreground
      container_name: ${CONTAINER_NAME}-app
      restart: unless-stopped
      environment:
      TZ: Europe/London
      PHP_MEMORY_LIMIT: 512M
      PHP_DISPLAY_ERRORS: ${PHP_DISPLAY_ERRORS}
      PHP_DISPLAY_STARTUP_ERRORS: ${PHP_DISPLAY_STARTUP_ERRORS}
      PHP_ERROR_REPORTING: ${PHP_ERROR_REPORTING}
      ESPOCRM_DATABASE_PLATFORM: Mysql
      ESPOCRM_DATABASE_HOST: ${CONTAINER_NAME}-db
      ESPOCRM_DATABASE_USER: ${DB_USER}
      ESPOCRM_DATABASE_PASSWORD: ${DB_PASSWORD}
      ESPOCRM_ADMIN_USERNAME: ${ESPOCRM_ADMIN_USERNAME}
      ESPOCRM_ADMIN_PASSWORD: ${ESPOCRM_ADMIN_PASSWORD}
      ESPOCRM_SITE_URL: ${ESPOCRM_SITE_URL}
      APACHE_SERVER_NAME: ${SERVER_NAME}
      volumes:
      - ./:/var/www/html
      - upload:/var/www/html/data/upload
      - ./docker/php.ini:/usr/local/etc/php/conf.d/zzz-custom.ini
      # - ./docker/php-dev.ini:/usr/local/etc/php/conf.d/zzz-custom.ini
      # - ./docker/localhost.crt:/etc/ssl/certs/localhost.crt
      # - ./docker/localhost.key:/etc/ssl/private/localhost.key
      depends_on:
      db:
      condition: service_healthy
      ports:
      - "${WEB_PORT:-80}:80"
      healthcheck:
      test: ["CMD-SHELL", "curl -kfsS ${SITE_URL}:${WEB_PORT} || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      logging:
      driver: json-file
      options:
      max-size: "10m"
      max-file: "3"
      networks:
      - espocrm-net
      websocket:
      image: ${CONTAINER_NAME}:latest
      container_name: ${CONTAINER_NAME}-websocket
      command: php websocket.php
      restart: unless-stopped
      environment:
      TZ: Europe/London
      ESPOCRM_DATABASE_PLATFORM: Mysql
      ESPOCRM_DATABASE_HOST: ${CONTAINER_NAME}-db
      ESPOCRM_DATABASE_USER: ${DB_USER}
      ESPOCRM_DATABASE_PASSWORD: ${DB_PASSWORD}
      ESPOCRM_CONFIG_USE_WEB_SOCKET: "true"
      ESPOCRM_CONFIG_WEB_SOCKET_PORT: "8080"
      ESPOCRM_CONFIG_WEB_SOCKET_DEBUG_MODE: "false"
      ESPOCRM_CONFIG_PHP_EXECUTABLE_PATH: "/usr/local/bin/php"
      ports:
      - "${WEBSOCKET_PORT}:8080"
      volumes:
      - ./:/var/www/html
      depends_on:
      - db
      healthcheck:
      test: ["CMD", "php", "-r", "echo (fsockopen('127.0.0.1', 8080) ? 'OK' : 'FAIL');"]
      interval: 30s
      timeout: 5s
      retries: 3
      networks:
      - espocrm-net
      logging:
      driver: json-file
      options:
      max-size: "10m"
      max-file: "3"
      daemon:
      image: ${CONTAINER_NAME}:latest
      container_name: ${CONTAINER_NAME}-daemon
      command: php daemon.php
      restart: unless-stopped
      environment:
      TZ: Europe/London
      ESPOCRM_DATABASE_PLATFORM: Mysql
      ESPOCRM_DATABASE_HOST: ${CONTAINER_NAME}-db
      ESPOCRM_DATABASE_USER: ${DB_USER}
      ESPOCRM_DATABASE_PASSWORD: ${DB_PASSWORD}
      # Daemon configuration
      ESPOCRM_CONFIG_DAEMON_MAX_PROCESS_NUMBER: "5"
      ESPOCRM_CONFIG_DAEMON_INTERVAL: "10"
      ESPOCRM_CONFIG_DAEMON_PROCESS_TIMEOUT: "36000"
      ESPOCRM_CONFIG_PHP_EXECUTABLE_PATH: "/usr/local/bin/php"
      volumes:
      - ./:/var/www/html
      - upload:/var/www/html/data/upload
      depends_on:
      db:
      condition: service_healthy
      networks:
      - espocrm-net
      healthcheck:
      test: ["CMD-SHELL", "pgrep -f 'php daemon.php' >/dev/null || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s
      logging:
      driver: json-file
      options:
      max-size: "10m"
      max-file: "3"
      volumes:
      db-data:
      mysql-logs:
      upload:
      driver: local
      driver_opts:
      type: nfs
      o: addr=192.9.201.130,nfsvers=4
      device: ":/volume2/espofiles/upload"
      networks:
      espocrm-net:
      driver: bridge

      Comment

      Working...