WordPress docker image, powered by s6 supervised nginx/php-fpm combo
Go to file
2023-04-06 08:40:00 +02:00
.github Add step for authorizing to ghcr 2023-04-05 22:54:20 +02:00
bin Disable TTY 2022-09-10 22:48:24 +02:00
build Apply formatting 2023-04-06 08:40:00 +02:00
patches Update WordPress 6.1.1 -> 6.2.0 2023-04-02 20:32:47 +02:00
rootfs Refactor: Change structure. Remove strictness 2023-03-22 03:24:27 +01:00
.gitignore Update .gitignore 2022-11-02 21:28:11 +01:00
Dockerfile Define more org.opencontainers labels 2023-04-06 03:30:03 +02:00
LICENSE Initial commit 2020-03-29 01:09:29 +01:00
README.md Update documentation for plugins installer 2023-03-21 12:59:44 +01:00

wordpress

WorPress docker image, powered by nginx/php-fpm combo and managed by s6 supervisor.

Attempt to fix several of WordPress anti-patterns in ready to deploy container

Deprecation notice

  • 2023-01-20 Deprecation of WordPress versions prior to 5.9
    • Preparation for PHP8.1 upgrade.
    • WordPress versions prior to 5.9 have no PHP8.1 support.
    • PHP8.0 active support has ended since 2022-11-28, therefore skipping this release
    • PHP7.4 reached end-of-life on 2022-11-28 and should not be used.
    • Old images will remain, but will receive no further updates, until their eventual removal. Usage is not recommended.
    • This decision will make build stack significantly lighter, ensuring much faster future builds
  • 2023-01-21 Retirement of PHP7.4. The king is dead, long live the king!
  • 2023-01-22 Replace NGINX + PHP-FPM combo with NGINX Unit
    • Split and rebase image and rework build
    • This is breaking change affecting all images
    • If your setup was vanilla, it should work out of the box
    • If you need nginx, you can set it up as a reverse proxy
    • NGINX Unit is modern application server, replacing old PHP-FPM
    • Independent benchmarks have show that NGINX Unit can handle much higher load and remain stable
  • 2023-01-23 WordPress is no longer installed during runtime and it's bundled into the image
    • This renders WP_LOCALE environment variable useless
    • Instead, you will be offered to select locale during the first setup

Public builds (docker)

You can use public build:

nlss/wordpress

You can also use specific version of WordPress:

nlss/wordpress:6.1.0

Replace version number with desired version, eg. 6.0.2.

Automatic plugin installer

WARNING: This feature is experimental and can fail. Proceed with caution

This container can install plugins during container startup defined in environment variable WORDPRESS_PLUGIN_LIST

If environment variable is left empty, or undefined, installer will skip.
Consider using custom image with plugins pre-installed in order to speed up container startup, and follow the best practices.

Usage example:

# Notice that specific version can be defined
WORDPRESS_PLUGIN_LIST=akismet:4.1.8 two-factor
WP_PLUGINS_INSTALL_CONCURRENCY=10

WP_PLUGINS_INSTALL_CONCURRENCY is optional, and defines how many plugins can be installed in parallel. Default is 5.
If you have a lot of plugins, you can increase this value to speed up installation, but be aware that this can cause issues, such as overloaded network connection, or even server overload.
You should not set this value to value higher than number of CPU threads ( * 1.5 ).

Caveats:

  • If plugin was previously installed, and not defined on the list, it will NOT be removed.
  • Plugins are not activated automatically; This is intentional.
  • If container startup speed is crucial (eg. start-on-demand ), don't use this feature, as it will block container startup until all plugins are installed.

Extending image

You can extend this image and install plugins during build time, using wp-plugin script.

Example:

FROM nlss/wordpress:6.1.1 AS wp-plugins-installer

RUN set -eux \
    && export WP_PLUGINS_PATH="/var/www/html/wp-content/plugins" \
    && wp-plugin download akismet 4.1.8 \
    && wp-plugin download two-factor \
    && wp-plugin download wp-mail-smtp

# Final image
FROM nlss/wordpress:6.1.1

# Example: 
# - Install ext-redis with pecl
# - Enable ext-redis
# - Remove pear/pecl cache
# - Put production-ready php.ini in use 
RUN set -eux \
    && pecl install redis \
    && docker-php-ext-enable redis \
    && rm -rf /tmp/pear \
    && cp "${PHP_INI_DIR}/php.ini-production" "${PHP_INI_DIR}/php.ini"
    
COPY --from=wp-plugins-installer ["/var/www/html/wp-content/plugins", "/var/www/html/wp-content/plugins"]

TODO

  • ~Disable core updates~
  • ~Install/update plugins on the fly using wp cli (with versioning)~
  • Install/update themes on the fly using wp cli (with versioning)
  • ~Apply theme and eventual plugin customizations using patch files~ (Partial)
  • Support automatic install using ENV
  • Create users automatically using ENV