12

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
0

3 Answers 3

28

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

Sign up to request clarification or add additional context in comments.

Comments

13

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

2 Comments

Thank you. It works. But I still wonder why I can't use php -dmemory_limit=-1 bin/magento setup:di:compile directly
Watch out setting memory_limit to -1, it may cause a problem in case when memory leak happens :)
-3

You have to change the memory limit for PHP cli in php docker container.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.