It is minimum wordpress with elementor and proelements preinstalled, running on sqlite and wp server
2.4K
Zero-dependency WordPress + Elementor development server.
FrankenPHP · PHP 8.5 · SQLite · Elementor · ProElements · hello-elementor
Single container. No MySQL. No Apache. No Nginx. Ready in ~10 seconds.
docker run -p 8080:8080 \
-e WP_ADMIN_USER=admin \
-e WP_ADMIN_PASS=admin \
juslintek/wp-sqlite-elementor-server:latest
| Component | Details |
|---|---|
| FrankenPHP | Caddy + PHP in one process. HTTP/2, HTTP/3, zstd/br/gzip. |
| PHP 8.5 (ZTS) | Thread-safe, OPcache enabled |
| WordPress | Latest stable |
| SQLite Database Integration | No MySQL/MariaDB/Postgres needed |
| Elementor | Page builder |
| ProElements | Free Elementor Pro alternative |
| hello-elementor | Default theme (activated on auto-setup) |
Core stack lives in /opt/elementor-stack/ and is symlinked into wp-content/plugins/ on every boot — immune to wp-content mounts.
| Tag | PHP | Description |
|---|---|---|
latest | 8.5 | Latest everything |
php8.5 | 8.5 | PHP 8.5 explicit |
php8.4 | 8.4 | PHP 8.4 stable |
wp6.9.4-elementor3.35.9-php8.5 | 8.5 | Pinned versions |
wp6.9.4-elementor3.35.9-php8.4 | 8.4 | Pinned versions |
All tags: linux/amd64 + linux/arm64
| Variable | Default | Description |
|---|---|---|
WP_ADMIN_USER | (none) | Set to enable auto-setup. Omit for manual web install. |
WP_ADMIN_PASS | admin | Admin password |
WP_ADMIN_EMAIL | [email protected] | Admin email |
WP_TITLE | Elementor MCP | Site title |
WP_DEBUG | false | WordPress debug mode |
URL is determined from the request Host header. Works from any domain/port without reconfiguration.
# Persist database + uploads
docker run -p 8080:8080 \
-v ./data/database:/wp/wp-content/database \
-v ./data/uploads:/wp/wp-content/uploads \
-e WP_ADMIN_USER=admin \
juslintek/wp-sqlite-elementor-server:latest
# Custom plugins (Elementor/ProElements still load from /opt)
docker run -p 8080:8080 \
-v ./my-plugins:/wp/wp-content/plugins \
-e WP_ADMIN_USER=admin \
juslintek/wp-sqlite-elementor-server:latest
| Mount | Purpose |
|---|---|
/wp/wp-content/database | SQLite database |
/wp/wp-content/uploads | Media uploads |
/wp/wp-content/plugins | Custom plugins |
/wp/wp-content/themes | Custom themes |
services:
wordpress:
image: juslintek/wp-sqlite-elementor-server:latest
ports:
- "8080:8080"
environment:
WP_ADMIN_USER: admin
WP_ADMIN_PASS: admin
WP_DEBUG: "true"
volumes:
- ./data/database:/wp/wp-content/database
- ./data/uploads:/wp/wp-content/uploads
Auto-setup creates an application password at /wp/app-password.txt:
docker exec <container> cat /wp/app-password.txt
curl -u admin:<password> http://localhost:8080/wp-json/wp/v2/pages
Multi-stage build: build tools (git, unzip) are NOT in the runtime image. Only curl + WP-CLI remain for runtime operations. All Alpine packages upgraded to latest patches on build.
The Alpine base image (dunglas/frankenphp:1-php8.5-alpine) inherits some packages with known CVEs that may not have upstream patches yet. For maximum security:
docker build --no-cache picks up latest Alpine patcheslatest in production-v ./data:/wp/wp-content/database:ro after setup| Package | Risk | Mitigation |
|---|---|---|
unzip | CVE-2008-0888 | Not in runtime image (build stage only) |
tar/busybox | Path traversal CVEs | No user-uploaded archives processed; WordPress doesn't use tar |
curl | Multiple CVEs | apk upgrade applied; rebuild to get latest |
nghttp2 | CVE-2026-27135 | apk upgrade applied; only used for HTTP/2 client |
FrankenPHP supports static binaries (PHP + Caddy in one file). Running on scratch/distroless would eliminate ALL OS-level CVEs. This is tracked for a future release.
# Local
docker build -t wp-sqlite-elementor-server .
# Multi-arch + push
docker buildx build --platform linux/amd64,linux/arm64 \
-t juslintek/wp-sqlite-elementor-server:latest --push .
# Different PHP version
docker build --build-arg PHP_VERSION=8.4 -t wp-sqlite-elementor-server:php8.4 .
FrankenPHP (Caddy + PHP 8.5 ZTS)
├── HTTP/2, HTTP/3, zstd/br/gzip
├── OPcache, worker-ready
└── Serves :8080
/wp/ WordPress root
├── wp-config.php Auto-generated, domain-agnostic, SQLite
└── wp-content/
├── database/.ht.sqlite SQLite database (mountable)
├── uploads/ Media (mountable)
├── plugins/ User plugins + symlinks to /opt
├── themes/ User themes + symlink to /opt
├── db.php SQLite drop-in (auto-created)
└── mu-plugins/ REST API config (recreated on boot)
/opt/elementor-stack/ Baked into image, immune to mounts
├── sqlite-database-integration/
├── elementor/
├── pro-elements/
└── hello-elementor/
BSL-1.1 — free to use for any purpose. Cannot be resold as a separate product without commercial license.
Content type
Image
Digest
sha256:a5d3a8666…
Size
111.3 MB
Last updated
about 1 month ago
docker pull juslintek/wp-sqlite-elementor-server:elementor