Skip to content

Commit

Permalink
feat: add images with PCOV coverage extension installed
Browse files Browse the repository at this point in the history
  • Loading branch information
fquffio committed May 19, 2022
1 parent 0981d8a commit 64e31be
Show file tree
Hide file tree
Showing 3 changed files with 194 additions and 0 deletions.
6 changes: 6 additions & 0 deletions pcov/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
ARG BASE_IMAGE=chialab/php:latest
FROM ${BASE_IMAGE}
LABEL maintainer="[email protected]"

# Install PCOV.
RUN install-php-extensions pcov
90 changes: 90 additions & 0 deletions pcov/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
SHELL := /bin/bash
ALL: build
.PHONY: build test push

PARENT_IMAGE := chialab/php
IMAGE := chialab/php-dev
VERSION ?= latest
PHP_VERSION = $(firstword $(subst -, ,$(VERSION)))

# Extensions.
EXTENSIONS := \
amqp \
bcmath \
bz2 \
calendar \
event \
exif \
gd \
gettext \
iconv \
imagick \
intl \
ldap \
mbstring \
memcached \
mysqli \
OPcache \
pcov \
pdo_mysql \
pdo_pgsql \
pgsql \
redis \
soap \
xsl \
zip \
sockets
ifeq (,$(findstring $(PHP_VERSION), 7.2 7.3 7.4 8.0 8.1 latest))
# Add more extensions to PHP < 7.2.
EXTENSIONS += mcrypt
endif

build:
@echo " =====> Building $(REGISTRY)$(IMAGE):$(VERSION)..."
docker image build --quiet --build-arg 'BASE_IMAGE=$(PARENT_IMAGE):$(VERSION)' -t $(REGISTRY)$(IMAGE):$(VERSION) .

test:
@echo -e "=====> Testing loaded extensions... \c"
@if [[ -z `docker image ls $(REGISTRY)$(IMAGE) | grep "\s$(VERSION)\s"` ]]; then \
echo 'FAIL [Missing image!!!]'; \
exit 1; \
fi
@IMAGE_PHP_VERSION=`docker container run --rm $(REGISTRY)$(IMAGE):$(VERSION) bash -c '/bin/echo $$PHP_VERSION' | cut -d '.' -f 1,2`; \
if [[ "$(PHP_VERSION)" != "latest" && "$${IMAGE_PHP_VERSION}" != "$(PHP_VERSION)" ]]; then \
echo "FAIL [wrong PHP version: expected $(PHP_VERSION), got $${IMAGE_PHP_VERSION}]"; \
exit 1; \
fi
@modules=`docker container run --rm $(REGISTRY)$(IMAGE):$(VERSION) php -m`; \
for ext in $(EXTENSIONS); do \
if [[ "$${modules}" != *"$${ext}"* ]]; then \
echo "FAIL [$${ext}]"; \
exit 1; \
fi \
done
@if [[ "$(VERSION)" == *'-apache' ]]; then \
apache=`docker container run --rm $(REGISTRY)$(IMAGE):$(VERSION) apache2ctl -M 2> /dev/null`; \
if [[ "$${apache}" != *'rewrite_module'* ]]; then \
echo 'FAIL [mod_rewrite]'; \
exit 1; \
fi \
fi
@if [[ -z `docker container run --rm $(REGISTRY)$(IMAGE):$(VERSION) composer --version 2> /dev/null | grep '^Composer version 2\.[0-9][0-9]*'` ]]; then \
echo 'FAIL [Composer 2]'; \
exit 1; \
fi
@if [[ -z `docker container run --rm $(REGISTRY)$(IMAGE):$(VERSION) composer2 --version 2> /dev/null | grep '^Composer version 2\.[0-9][0-9]*'` ]]; then \
echo 'FAIL [Composer 2]'; \
exit 1; \
fi
@if [[ -z `docker container run --rm $(REGISTRY)$(IMAGE):$(VERSION) composer1 --version 2> /dev/null | grep '^Composer version 1\.[0-9][0-9]*'` ]]; then \
echo 'FAIL [Composer 1]'; \
exit 1; \
fi
@if [[ -z `docker container run --rm $(REGISTRY)$(IMAGE):$(VERSION) composer1 global show 2> /dev/null | grep '^hirak/prestissimo [0-9][0-9]*\.[0-9][0-9]*'` ]]; then \
echo 'FAIL [Composer 1 plugin - prestissimo]'; \
exit 1; \
fi
@echo 'OK'

push:
docker image push $(REGISTRY)$(IMAGE):$(VERSION)
98 changes: 98 additions & 0 deletions pcov/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
<p align="center">
<a href="https://www.chialab.io/p/docker-php">
<img alt="Docker PHP Images logo" width="144" height="144" src="https://raw.githack.com/chialab/docker-php/master/logo.svg" />
</a>
</p>

<p align="center">
<strong>Docker PHP images</strong>
</p>

<p align="center">
<a href="https://github.com/chialab/docker-php/actions"><img alt="GitHub Workflow Status" src="https://img.shields.io/github/workflow/status/chialab/docker-php/Build,%20test%20and%20publish%20images?style=flat-square"></a>
<a href="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/chialab/docker-php"><img alt="Source link" src="https://img.shields.io/badge/Source-GitHub-lightgrey.svg?style=flat-square"></a>
<a href="https://www.chialab.it"><img alt="Authors link" src="https://img.shields.io/badge/Authors-Chialab-lightgrey.svg?style=flat-square"></a>
<a href="https://hub.docker.com/r/chialab/php-pcov/"><img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/chialab/php-pcov.svg?style=flat-square"></a>
<a href="https://github.com/chialab/docker-php/blob/master/LICENSE"><img alt="License" src="https://img.shields.io/github/license/chialab/docker-php.svg?style=flat-square"></a>
</p>

---

Docker images built on top of the [official PHP images](https://hub.docker.com/r/_/php/) with the addition of some common and useful extensions, installed with [mlocati/docker-php-extension-installer](https://github.com/mlocati/docker-php-extension-installer), and are meant for *continuout integration purposes*. You can find these images on the [Docker Hub](https://hub.docker.com/r/chialab/php-pcov/) (and if you're reading this file, you're probably already there).

An automated build is set up, so they should be always up-to-date with the Dockerfiles in the [GitHub repository](https://github.com/chialab/docker-php). Also, every time an official PHP image is updated, a rebuild is triggered, so that you will always find the latest security patches installed in these images.

For more production-like environments, you might want to choose an [image *without* PCOV installed](https://hub.docker.com/r/chialab/php/), instead.

## Available tags
- `latest`
- `7.1`
- `7.1-apache`
- `7.1-fpm`
- `7.2`
- `7.2-apache`
- `7.2-fpm`
- `7.3`
- `7.3-apache`
- `7.3-fpm`
- `7.4`
- `7.4-apache`
- `7.4-fpm`
- `8.0`
- `8.0-apache`
- `8.0-fpm`
- `8.1`
- `8.1-apache`
- `8.1-fpm`

As you might have guessed, all tags are built on top of the corresponding tag of the official image. Not all tags are supported in order to easen maintenance.

## Installed extensions
The following modules and extensions have been enabled,
in addition to those you can already find in the [official PHP image](https://hub.docker.com/r/_/php/):

- `amqp`
- `bcmath`
- `bz2`
- `calendar`
- `event`
- `exif`
- `gd`
- `gettext`
- `iconv`
- `imagick`
- `intl`
- `ldap`
- `mbstring`
- `mcrypt` (_only PHP ≤ 7.1_)
- `memcached`
- `mysql` (_only PHP 5.x_)
- `mysqli`
- `pcov`
- `pdo_mysql`
- `pdo_pgsql`
- `pgsql`
- `redis`
- `soap`
- `sockets`
- `xsl`
- `Zend OPcache`
- `zip`

You will probably not need all this stuff. Even if having some extra extensions loaded ain't a big issue in most cases (especially in a development environment), you will very likely want to checkout this repository, remove unwanted extensions from the `Dockerfile`, and build your own image — for sometimes removing is easier than adding. 😉

## Composer
[Composer](https://getcomposer.org) is installed globally in all images. Please, refer to their documentation for usage hints.
Since 2020/11/01 both version 1 and 2 are installed, available through `composer1` and `composer2` commands respectively (`composer` in now a symlink to `composer2`).
[Prestissimo (composer plugin)](https://github.com/hirak/prestissimo) is installed globally in all images, for use with Composer version 1. It's a plugin that downloads packages in parallel to speed up the installation process of Composer packages.

## Contributing
If you find an issue, or have a special wish not yet fulfilled, please [open an issue on GitHub](https://github.com/chialab/docker-php/issues) providing as many details as you can (the more you are specific about your problem, the easier it is for us to fix it).

Pull requests are welcome, too! 😁 Please, run `make build` and `make test` before attempting a pull request. Also, it would be nice if you could stick to the [best practices for writing Dockerfiles](https://docs.docker.com/articles/dockerfile_best-practices/).

---

## License

Docker PHP Images is released under the [MIT](https://github.com/chialab/docker-php/blob/master/LICENSE) license.

0 comments on commit 64e31be

Please sign in to comment.