PHP memory size exhausted in docker with magento/bin setup:di:compile

20,595

Solution 1

In docker-compose.yml

php:
    container_name: php-server
    build: ./php/
    volumes:
      - ./..:/var/www
      - ./php/ini:/usr/local/etc/php // note that this line maps docker's /usr/local/etc/php

At your php Dockerfile directory under ini/conf.d/ create a file named memory_limit.ini So your directory will be .../php/ini/conf.d/memory_limit.ini Inside memory_limit.ini

memory_limit = -1

Solution 2

The Docker way

Confirm you are low on memory by running this command on your docker container bash ~$ php -r "echo ini_get('memory_limit').PHP_EOL;". It should output 128M. To increase, check if the /usr/local/etc/php/conf.d/ path exists in your container. I believe it should if your php repo is build and maintained from the official Docker Hub. If it exists:


~$ cd /usr/local/etc/php/conf.d/
#create and or update a file called docker-php-memlimit.ini (comment)
#in /usr/local/etc/php/conf.d/(comment)
~$ echo 'memory_limit = -1' >> /usr/local/etc/php/conf.d/docker-php-memlimit.ini
#from the line below we setting memory to unlimited by using -1 (comment)
#Or you can set amount allocated by changing 'memory_limit = 512M' (comment)

# then check the memory with the following code (comment)
~$ php -r "echo ini_get('memory_limit').PHP_EOL;"

To avoid running bash everytime you need to install this, you add the file to your dockerfile as follow:


#dockerfile
RUN cd /usr/local/etc/php/conf.d/ && \
  echo 'memory_limit = -1' >> /usr/local/etc/php/conf.d/docker-php-memlimit.ini

If the docker build cannot change directory to /usr/local/etc/php/conf.d/ it will break. You can explorer from your repo other means.

References: https://github.com/nextcloud/docker/issues/447

Share:
20,595
Chung
Author by

Chung

Updated on January 16, 2020

Comments

  • Chung
    Chung over 4 years

    I got this error in log file after run php bin/magento setup:di:compile or php bin/magento deploy:mode:set production in php:7.1-fpm image's container.

    [2019-02-04 12:15:26] main.ERROR: /usr/local/bin/php -f /var/www/html/m230/bin/magento setup:di:compile 2>&1 Compilation was started. %message% 0/7 [>---------------------------] 0% < 1 sec 72.0 MiB%message% 0/7 [>---------------------------] 0% < 1 sec 72.0 MiBProxies code generation... 0/7 [>---------------------------] 0% < 1 sec 72.0 MiB Proxies code generation... 1/7 [====>-----------------------] 14% 1 sec 76.0 MiB Repositories code generation... 1/7 [====>-----------------------] 14% 1 sec 76.0 MiB Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36864 bytes) in /var/www/html/m230/setup/src/Magento/Setup/Module/Di/Code/Reader/FileClassScanner.php on line 81 Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors. [] []

    I tried to increase memory limit by running php -dmemory_limit=1G bin/magento setup:di:compile or even php -dmemory_limit=-1 bin/magento setup:di:compile

    This error doesn't occur if I use php:7.1-apache image (I use the same source code and database, just change image)

    This error occurs on both my laptop (running arch-linux) and desktop (running ubuntu). I know they are strong enough to run that command.

    My Dockerfile I used:

    FROM php:7.1-fpm
    
    # Install necessary libraries for Magento2
    RUN apt-get -y update \
        && apt-get install -y \
            libmcrypt-dev \
            libxslt-dev \
            zlib1g-dev \
            libpng-dev \
            libjpeg-dev \
            libfreetype6-dev \
            libjpeg62-turbo-dev
    RUN docker-php-ext-install -j$(nproc) iconv
    RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
    RUN docker-php-ext-install pdo_mysql mcrypt xsl intl zip bcmath -j$(nproc) gd soap
    
    # Install xdebug
    RUN pecl install xdebug
    RUN docker-php-ext-enable xdebug
    RUN echo "xdebug.remote_enable=on\n\
    xdebug.remote_autostart=off\n\
    xdebug.remote_host=10.5.0.1\n\
    xdebug.remote_port=9000\n\
    xdebug.remote_handler=dbgp" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
    
    # Set memory_limit
    RUN echo "php_admin_value[memory_limit] = 2G" >> /usr/local/etc/php-fpm.d/www.conf
    
    # Install cron
    #RUN apt-get install -y cron
    
    # Remove apt cache
    RUN rm -rf /var/lib/apt/lists/*
    
    # Create non-root user
    ARG USER_NAME
    ARG UID
    RUN useradd -m -U ${USER_NAME} -u ${UID} -p1 -s /bin/bash -G root -o
    
    # Edit PS1 in basrc
    RUN echo "PS1='${debian_chroot:+($debian_chroot)}\w\$ '" >> /home/${USER_NAME}/.bashrc
    
    # Change www-data user to ${USER_NAME}
    RUN sed -i -e "s/www-data/${USER_NAME}/" /usr/local/etc/php-fpm.d/www.conf
    
  • Chung
    Chung over 5 years
    Thank you. It works. But I still wonder why I can't use php -dmemory_limit=-1 bin/magento setup:di:compile directly