dsavell/grav
Grav is a Fast, Simple, and Flexible file-based Web-platform. There is Zero
installation required. Although Grav follows principles similar to other
flat-file CMS platforms, it has a different design philosophy than most.
The underlying architecture of Grav is built using well established and
best-in-class technologies. This is to ensure that Grav is simple to use and
easy to extend. Some of these key technologies include:
Twig Templating: for powerful control of the user interface
Markdown: for easy content creation
YAML: for simple configuration
Parsedown: for fast Markdown and Markdown Extra support
Doctrine Cache: for performance
Pimple Dependency Injection Container: for extensibility and maintainability
Symfony Event Dispatcher: for plugin event handling
Symfony Console: for CLI interface
Gregwar Image Library: for dynamic image manipulation
Supported Architectures
We utilise the docker manifest for multi-platform awareness. More information
is available from the Docker
manifest list documentation .
The admin and core tags are multi-platform images. Docker automatically selects the matching image for your architecture.
The architectures supported by this image are:
Architecture Available Tag x86-64 ✅ linux/amd64 arm64 ✅ linux/arm64 armhf ❌ arm32v7-<version tag>
Version Tags
This image provides various versions that are available via tags.
Tag Available Description admin ✅ Stable Grav Core + Admin plugin releases core ✅ Stabe Grav Core releases admin-<date> ✅ Stable Grav Core + Admin plugin releases + date core-<date> ✅ Stabe Grav Core releases + date admin-<version tag> ✅ Pinned Grav Core + Admin plugin releases core-<version tag> ✅ Pinned Grav Core releases admin-<version tag>-<date> ✅ Pinned Grav Core + Admin plugin releases + date core-<version tag>-<date> ✅ Pinned Grav Core releases + date
Application Setup
WebUI can be found at http://<your-ip>
More information can be found in the official
installation documentation .
Usage
Here are some example snippets to help you get started creating a container.
docker-compose
---
services:
grav:
image: dsavell/grav:<TAG>
container_name: grav
restart: unless-stopped
environment:
- DUID=1000
- DGID=1000
- TZ=Europe/London # optional
volumes:
- /data/containers/grav/backup:/var/www/grav/backup
- /data/containers/grav/user:/var/www/grav/user
ports:
- 80:80
Copy
docker create \
--name=grav \
--restart unless-stopped \
-e DUID=1000 \
-e DGID=1000 \
-p 8080:80 \
-e TZ=Europe/London `# optional` \
-v /data/containers/grav/backup:/var/www/grav/backup \
-v /data/containers/grav/user:/var/www/grav/user \
dsavell/grav:<TAG>
docker start grav
Copy
Parameters
Container images are configured using parameters passed at runtime (such as
those above). These parameters are separated by a colon and indicate
<external>:<internal> respectively. For example, -p 8080:80 would expose
port 80 from inside the container to be accessible from the host's IP on port
8080 outside the container.
Parameter Function -p 80Http webUI -e DUID=1000for UserID - see below for explanation -e DGID=1000for GroupID - see below for explanation -e TZ=Europe/LondonSet your timezone -v /var/www/backupContains your location for Grav backups -v /var/www/userContains your Grav content
User / Group Identifiers
When using volumes (-v flags) permissions issues can arise between the host OS and the container, we avoid this issue by allowing you to specify the user PUID and group PGID.
Ensure any volume directories on the host are owned by the same user you specify and any permissions issues will vanish like magic.
In this instance PUID=1000 and PGID=1000, to find yours use id user as below:
$ id username
uid=1000(dockeruser) gid=1000(dockergroup) groups=1000(dockergroup)
Copy
Issues
Changelog
25/10/2026
BREAKING CHANGES!!!!!
Updated OS from bookworm to trixie
Updated to PHP 8.4 INCLUDES FIX FOR LATEST CVE!!!!
Include ARM image
Stripped back to one docker file with ARGS.
Removed confusing logic in init-admin and init-core.
Stripped back nginx configuration and moved to gravs own /etc/nginx/conf.d/grav.conf
Regressed plugin install (FOR NOW)
Regressed robots.txt disallow (FOR NOW)
Regressed multisite (FOR NOW)
Regressed running user back to root (FOR NOW)
Updated pre-commit-config
Pinned all github actions
Updated github actions references to latest.
Updated Renovate bot to include GitHub actions.
03/10/2023:
Removed cumbersome DevOps steps.
Updated GitHub workflows with nodejs 20.x
Updated pre-commit hooks.
Updated OS from bullseye to bookworm.
Updated PHP 7.4 to 8.2. Thanks to funilrys #56
Updated some documentation regarding installation steps.
Added ability to install plugins. Thanks to tyzbit #64
24/07/2022:
Added moved from master branch to main branch.
Added commitlint function to verify proper commit messages.
Added .editorconfig to ensure standards across IDE's.
Added .gitattributes to ensure standards across git CLI.
Added build to NPM/YARN to locally verify code & commit messages.
removed build shell script.
Added GitHub Actions CI/CD workflows
1:00am everyday builds.
Build on any new change to main branch.
Code standards check.
Docker lint check.
Docker build check.
Added prettier codebase formatting.
Added pre-commit yaml to validate code syntax / format.
Added MIT license.
Added pre-commit husky utility to trigger pre-commit & commitlint with prettier for local development.
Correct hadolint errors in the Dockerfiles.
18/05/2022:
Added subdomain as an option for GRAV_MULTISITE
Added NGINX_CLIENT_MAX_BODY_SIZE to specify the nginx config client_max_body_size
Updated to Grav 1.7.33
16/10/2021:
Updated to Grav 1.7.23
Updated curl script in Docker file to correctly pull latest version of grav.
Updated to Debian 11.x (bullseye)
Changed crontab logic, however it works, just complains in the UI, known bug in admin plugin above.
Added check for bin/grav/ scheduler -i to startup output.
Added check for crontab -l to startup output.
15/04/2021:
Updated to Grav 1.7.12
Added nano text editor to the image.
10/04/2021:
Updated to Grav 1.7.10
Updated to PHP 7.4.x
Fix permissions on startup because of topic names with whitespaces. Thanks to Miroka96 #22
Added support for multisite subdirectory. Thanks to hughbris #21
Fixed uploading to the CMS using a tmp directory this is now /var/www/grav/tmp.
11/10/2020:
02/08/2020:
01/06/2020:
22/04/2020:
12/04/2020:
20/02/2020:
09/12/2019:
Fixed missing php7.3-mbstring on admin tag. Thanks to Miroka96 #13
08/12/2019:
30/11/2019:
Updated baseimage from stretch to buster. Thanks to coldestheart #10
Added cron & added cronjob allows jobs to be run on a periodic basic, GRAV relies on this. Thanks to coldestheart #10
Added php7.3-intl for Multilang support for twig tools. Thanks to coldestheart #10
Enabled caching in Nginx for tools that analyze speed performance (like gtmetrix) Thanks to coldestheart #10
Startup scripts now enable cron. Thanks to coldestheart #10
15/11/2019:
Fixed working directory this is now set to /var/ww/grav, now commands like bin/grav & bin/gpm can be used directly. Thanks to aptonline #9
10/08/2019:
Fixed GRAV user directory being overwritten when rebuilding container. Thanks to Miroka96 #6
18/06/2019: The Better Release?
Better File/Volume control
Better tagging / versioning of GRAV Core.
Better User/Group management.
Better Documentation.
10/06/2019: The Refactor Release
Converted to minideb for better package management.
Updated to PHP 7.3.
Better logic to pull latest version when building.
Better logging.
blog image removed.
GRAV Core & GRAV Core + Admin Plugin only images for now.
Smaller Docker layering.
Fixed nginx configuration thanks to esapy #1
10/04/2018: The Volume Release
The /var/www volume can now be mounted.
02/01/2018: The 2018 Release
Improved Code
Now using github API to pull latest GRAV release
27/07/2017: The Automated Release
Updated tag "blog" to now use github API to download latest Blog-Skeleton zip file
Improved code on all tags
Typo corrections on the README.md
29/06/2017: The Blog Release
28/06/2017: The Even Smaller Release
Now uses image from ej52/alpine-nginx-php
Size has reduced from 657 to 267mb & with admin plugin 277mb
22/06/2017: The Better Release
Now uses image from php:7.0-apache
Size has reduced from 1.2gb to 657mb & with admin plugin 682mb
Corrected GRAV permissions
Less packages installed during Docker build + cleanup
21/06/2017: Initial Release
First Initial Release
No Optimization
Full Operating System of centos used
No Custom Features