PHP memory size exhausted in docker with magento/bin setup:di:compile
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
Chung
Updated on January 16, 2020Comments
-
Chung over 4 years
I got this error in log file after run
php bin/magento setup:di:compile
orphp bin/magento deploy:mode:set production
inphp: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 evenphp -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 over 5 yearsThank you. It works. But I still wonder why I can't use
php -dmemory_limit=-1 bin/magento setup:di:compile
directly