Jorge
Jorge

Reputation: 353

Docker and laravel not clearing the cache

I have an app running with docker and laravel but there are some instructions that apparently are executed but not functioning.

These instructions are php artisan clear:cache and php artisan optimize. Sometimes I need to get into the container and run these instructions in order to have my changes reflected in the browsers. Apart from the failures that kubernetes detects due to the unreflected changes

FROM php:7.2.0-fpm as php

RUN apt-get update && apt-get install -y openssl openssh-client \
    rsync sshpass zip unzip git vim libmcrypt-dev mysql-client \
    libssh2-1-dev libmagickwand-dev \n
    gnupg2 --no-install-recommends zlib1g-dev sass \
    && pecl install mcrypt-1.0.1 \
    && docker-php-ext-enable mcrypt \
    && pecl install imagick \
    && docker-php-ext-enable imagick \
    && docker-php-ext-install pdo_mysql \
    && docker-php-ext-install gd \
    && docker-php-ext-install zip \
    && pecl install ssh2-1.0  \
    && docker-php-ext-enable ssh2

RUN curl --silent --location https://deb.nodesource.com/setup_11.x | bash -
RUN apt-get install -y nodejs
RUN npm install --global bower

WORKDIR /var/www/html

COPY install-composer.sh install-composer.sh
RUN bash ./install-composer.sh

COPY composer.json ./
COPY composer.lock ./
RUN composer install --no-scripts --no-autoloader
COPY . ./
RUN composer update
RUN composer install

COPY zz-docker.conf /usr/local/etc/php-fpm.d/zz-docker.conf

RUN mkdir -p /var/run/php/sock/

RUN sass resources/sass/style.scss:public/assets/stylesheets/style.css
RUN bower install --allow-root

RUN composer dump-autoload
RUN php artisan vendor:publish --provider="Sentry\SentryLaravel\SentryLaravelServiceProvider"

ONBUILD chown -R www-data:www-data .
RUN php artisan optimize && php artisan config:cache \
    && php artisan view:cache && php artisan view:clear

Most of the time I need to get into the container and run the php artisan optimize, view:cache and view:clear again even though they are in the Dockerfile so it shouldn't be necessary to do it all over again

Upvotes: 3

Views: 10724

Answers (3)

Balmipour
Balmipour

Reputation: 3055

Just ran into a problem of cache:clear with Laravel too (no Docker involved in my case)

Fact is : if Artisan has no rights to clear caches, it just silently fails, proudly telling you cache have been successfully cleared (sigh).

See https://github.com/laravel/framework/issues/1179 for more details

*In my case, adding simple "sudo" before my command did the trick... but I lost half an hour understanding the cause (what an introduction to Laravel/Artisan :p) *
I have a Laravel v6.5

Upvotes: 1

Alok Upadhya
Alok Upadhya

Reputation: 41

You can also use the cmd:

sudo docker-compose exec php php /var/www/html/path_to_laravel_project_dir/artisan config:cache

it will execute the artisan cmd in the container.

Upvotes: 1

Mostafa Hussein
Mostafa Hussein

Reputation: 11950

Any commands that are being executed using RUN in the Dockerfile will be executed only during the build phase. If you wish to run them while starting a container so you don't have to run them manually then you need to use a script e.g. bash script that can be used as an ENTRYPOINT for your Dockerfile and then make this script execute the command that you should run to start the application. So your entrypoint.sh can look like this:

# entrypoint.sh
#!/usr/bin/env sh
...
php artisan optimize
php artisan config:cache
php artisan view:cache
php artisan view:clear
...
php artisan serve # or use exec "$@" and pass php artisan serve through CMD in Dockerfile

This will make every container that you start execute all of these commands before start serving your application.

Other links that you might want to check:

Upvotes: 7

Related Questions