When I first used Grav, “a modern open source flat-file CMS,” to host this site, I setup a local development environment using macOS’s built-in Apache and PHP. But this is getting harder with each macOS release, so it’s time to use a Docker container instead.

For example with macOS Catalina, first we need to Enable PHP in Apache. Then, after installing Grav locally, we have to workaround PHP ZIP Extension and fix the Grav Admin Panel URL redirect. That is a lot of work for every macOS release, so I’m not even got going to try this on Big Sur moving forward!

With the release of Grav v1.7 three days ago (19 Jan 21), I thought it would be easier to use a container to test this version, because there are some major changes including the requirement for PHP 7.3.6+. Well... it wasn’t so easy.

I backed up my entire Grav site (running an older version). I replaced .htacess with the default version from the latest Grav Core + Admin plugin package, and deleted customized php.ini and .user.ini.

Next, I created a container from the Docker Official PHP + Apache Image and, COPY-ied my Grav files to /var/www/html.

On first run - I got a Grav page like this with three issues:

  • PHP GD Image Manipulation Library gd and PHP Zip extension are both not installed.
  • Apache mod_rewrite is not installed.

Grav v1.7 running in a PHP-Apache container

Figured that I needed to docker-php-ext-install the extensions, but got compile errors...libraries missing too. After a bit of Googling, figured out which -dev libraries had to be installed first.

Tried again, and the missing dependencies are resolved! But, this time, I got a Grav error TypeError: abs():Argument #1 ($num) must be of type int|float, string given. I turned on the Grav setting to show more detailed errors by editing /var/www/html/user/config/system.yaml and enabling:

errors:
  display: true

Grav v1.7 “abs()” TypeError with PHP v8

What’s this? Well it turns out the container php:apache uses PHP v8 and there must be some issue the Grav code, because when I reverted to the required PHP v7.3.26... then, everything worked as expected! Huh.

So, my Dockerfile is:

FROM php:7.3.26-apache
RUN apt update \
 && apt install -y libpng-dev libzip-dev \
 && docker-php-ext-install gd zip \
 && a2enmod rewrite \
 && cp "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY grav/ /var/www/html

With this, I managed to log in to my Grav instance (http://127.0.0.1:8080), and update the core to v1.7.x and all plugins successfully.

You might get into a loop trying to login to the admin page with http://localhost:8080/admin because Apache complains that it Could not reliably determine the server's fully qualified domain name... Set the 'ServerName' directive globally to suppress this message.

Don’t feel like being so verbose today, so:

  • To build the image: docker build -t grav .
  • To start the container in the background: docker run -d --name grav -p 8080:80 grav
  • To get to a bash shell in the running container: docker exec -it grav bash
  • To stop it: docker stop grav
  • To delete it docker rm grav

Good luck!