Skip to content

Add php8.0 support #551

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 21, 2021
Merged

Add php8.0 support #551

merged 1 commit into from
Jan 21, 2021

Conversation

tianon
Copy link
Member

@tianon tianon commented Dec 9, 2020

Closes #540

(I don't think this makes sense to make the default just yet, but definitely makes sense to support as an optional variant!)

@tianon tianon mentioned this pull request Dec 9, 2020
@LeoColomb
Copy link

Indeed, but Imagick/imagick#358 is blocking for full support.

@spacedmonkey
Copy link

Possibility silly question. But WordPress supports both Imagick and GD out of the box. Would it be possible for to use GD instead of Imagick?

@tianon
Copy link
Member Author

tianon commented Dec 10, 2020

Great question! Are all the core functionality uses of imagick able to fall back to GD? What are the pros/cons? Is there one which is "officially" recommended/preferred over the other? 🙈

@mweichert

This comment has been minimized.

@mweichert

This comment has been minimized.

@mweichert
Copy link

mweichert commented Dec 17, 2020

Indeed, but Imagick/imagick#358 is blocking for full support.

Note, you can get the image to build by altering the Dockerfile to build imagick from source instead of using pecl:

Dockerfile:
FROM php:8.0-apache

# persistent dependencies
RUN set -eux; \
	apt-get update; \
	apt-get install -y --no-install-recommends \
# Ghostscript is required for rendering PDF previews
		ghostscript \
	; \
	rm -rf /var/lib/apt/lists/*

# install the PHP extensions we need (https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions)
RUN set -ex; \
	\
	savedAptMark="$(apt-mark showmanual)"; \
	\
	apt-get update; \
	apt-get install -y --no-install-recommends \
		libfreetype6-dev \
		libjpeg-dev \
		libmagickwand-dev \
		libpng-dev \
		libzip-dev \
		git \
	; \
	\
	docker-php-ext-configure gd --with-freetype --with-jpeg; \
	docker-php-ext-install -j "$(nproc)" \
		bcmath \
		exif \
		gd \
		mysqli \
		zip \
	; \
	git clone https://github.com/Imagick/imagick; \
	cd imagick; \
	phpize && ./configure; \
	make; \
	make install; \
	\
	docker-php-ext-enable imagick; \
	\
# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
	apt-mark auto '.*' > /dev/null; \
	apt-mark manual $savedAptMark; \
	ldd "$(php -r 'echo ini_get("extension_dir");')"/*.so \
		| awk '/=>/ { print $3 }' \
		| sort -u \
		| xargs -r dpkg-query -S \
		| cut -d: -f1 \
		| sort -u \
		| xargs -rt apt-mark manual; \
	\
	apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
	rm -rf /var/lib/apt/lists/*

# set recommended PHP.ini settings
# see https://secure.php.net/manual/en/opcache.installation.php
RUN set -eux; \
	docker-php-ext-enable opcache; \
	{ \
		echo 'opcache.memory_consumption=128'; \
		echo 'opcache.interned_strings_buffer=8'; \
		echo 'opcache.max_accelerated_files=4000'; \
		echo 'opcache.revalidate_freq=2'; \
		echo 'opcache.fast_shutdown=1'; \
	} > /usr/local/etc/php/conf.d/opcache-recommended.ini
# https://wordpress.org/support/article/editing-wp-config-php/#configure-error-logging
RUN { \
# https://www.php.net/manual/en/errorfunc.constants.php
# https://github.com/docker-library/wordpress/issues/420#issuecomment-517839670
		echo 'error_reporting = E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_RECOVERABLE_ERROR'; \
		echo 'display_errors = Off'; \
		echo 'display_startup_errors = Off'; \
		echo 'log_errors = On'; \
		echo 'error_log = /dev/stderr'; \
		echo 'log_errors_max_len = 1024'; \
		echo 'ignore_repeated_errors = On'; \
		echo 'ignore_repeated_source = Off'; \
		echo 'html_errors = Off'; \
	} > /usr/local/etc/php/conf.d/error-logging.ini

RUN set -eux; \
	a2enmod rewrite expires; \
	\
# https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html
	a2enmod remoteip; \
	{ \
		echo 'RemoteIPHeader X-Forwarded-For'; \
# these IP ranges are reserved for "private" use and should thus *usually* be safe inside Docker
		echo 'RemoteIPTrustedProxy 10.0.0.0/8'; \
		echo 'RemoteIPTrustedProxy 172.16.0.0/12'; \
		echo 'RemoteIPTrustedProxy 192.168.0.0/16'; \
		echo 'RemoteIPTrustedProxy 169.254.0.0/16'; \
		echo 'RemoteIPTrustedProxy 127.0.0.0/8'; \
	} > /etc/apache2/conf-available/remoteip.conf; \
	a2enconf remoteip; \
# https://github.com/docker-library/wordpress/issues/383#issuecomment-507886512
# (replace all instances of "%h" with "%a" in LogFormat)
	find /etc/apache2 -type f -name '*.conf' -exec sed -ri 's/([[:space:]]*LogFormat[[:space:]]+"[^"]*)%h([^"]*")/\1%a\2/g' '{}' +


ENV WORDPRESS_VERSION 5.6
ENV WORDPRESS_SHA1 db8b75bfc9de27490434b365c12fd805ca6784ce

RUN set -ex; \
	curl -o wordpress.tar.gz -fSL "https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz"; \
	echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c -; \
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
	tar -xzf wordpress.tar.gz -C /usr/src/; \
	rm wordpress.tar.gz; \
	chown -R www-data:www-data /usr/src/wordpress; \
# pre-create wp-content (and single-level children) for folks who want to bind-mount themes, etc so permissions are pre-created properly instead of root:root
# wp-content/cache: https://github.com/docker-library/wordpress/issues/534#issuecomment-705733507
	mkdir wp-content; \
	for dir in /usr/src/wordpress/wp-content/*/ cache; do \
		dir="$(basename "${dir%/}")"; \
		mkdir "wp-content/$dir"; \
	done; \
	chown -R www-data:www-data wp-content; \
	chmod -R 777 wp-content

VOLUME /var/www/html

COPY docker-entrypoint.sh /usr/local/bin/

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["apache2-foreground"]

@XedinUnknown

This comment has been minimized.

@XedinUnknown

This comment has been minimized.

@shogo82148
Copy link

becoming a sponsor of https://github.com/sponsors/Danack who maintains imagick is the best way.

Imagick/imagick#358 (comment)

Please can you tell whoever runs your company that the Github sponsors program is now available for companies. If companies depend on software, then it needs to be supported or it will either go away, or be absorbed by Microsoft who appear to be borging as much of the software ecosystem as they can.
https://github.com/sponsors/Danack

@LeoColomb

This comment has been minimized.

@XedinUnknown

This comment has been minimized.

@tianon
Copy link
Member Author

tianon commented Jan 20, 2021

Yes, this is still blocked on Imagick/imagick#358 -- given the upstream developer's position, we're not going to override them and publish a build from master against their wishes.

Other questions it would be useful to figure out an answer to which could potentially unblock this:

Possibility silly question. But WordPress supports both Imagick and GD out of the box. Would it be possible for to use GD instead of Imagick?

Great question! Are all the core functionality uses of imagick able to fall back to GD? What are the pros/cons? Is there one which is "officially" recommended/preferred over the other?

@TimothyBJacobs
Copy link

imagick is the preferred library, but GD is acceptable. https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions. AFAIK the only major limitation in terms of feature sets is that Core can't generate PDF thumbnails with GD.

IMO it'd be worth it to generate the image with GD support. Particularly to make it easier for developers to test even if not all features are available.

@tianon
Copy link
Member Author

tianon commented Jan 20, 2021

That's exactly the type of documentation I was looking for; thank you @TimothyBJacobs! ❤️

From my reading of that, it sounds pretty strongly discouraged, but "good enough" to get folks testing PHP 8.0 (and we'll just have to wait for Imagick/imagick#358 before it can be even considered as the default).

@yosifkit yosifkit merged commit 12806f6 into docker-library:master Jan 21, 2021
@yosifkit yosifkit deleted the php8.0 branch January 21, 2021 01:22
docker-library-bot added a commit to docker-library-bot/official-images that referenced this pull request Jan 21, 2021
Changes:

- docker-library/wordpress@12806f6: Merge pull request docker-library/wordpress#551 from infosiftr/php8.0
- docker-library/wordpress@ee3c59f: Add php8.0 support
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Support for PHP8 ?
8 participants