Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .github/workflows/publish.8.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,16 @@ jobs:
chialab/php-xhprof:${{ matrix.version }}${{ matrix.flavor }}
ghcr.io/chialab/php-xhprof:${{ matrix.version }}${{ matrix.flavor }}
push: true

- name: Build OTel image and push to registry
uses: docker/build-push-action@v5
with:
platforms: linux/amd64,linux/arm64
cache-to: type=inline
context: ./otel
build-args: |
BASE_IMAGE=ghcr.io/chialab/php:${{ matrix.version }}${{ matrix.flavor }}
tags: |
chialab/php-otel:${{ matrix.version }}${{ matrix.flavor }}
ghcr.io/chialab/php-otel:${{ matrix.version }}${{ matrix.flavor }}
push: true
13 changes: 13 additions & 0 deletions .github/workflows/publish.latest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,16 @@ jobs:
chialab/php-xhprof:${{ matrix.version }}
ghcr.io/chialab/php-xhprof:${{ matrix.version }}
push: true

- name: Build OTel image and push to registry
uses: docker/build-push-action@v5
with:
platforms: linux/amd64,linux/arm64
cache-to: type=inline
context: ./otel
build-args: |
BASE_IMAGE=ghcr.io/chialab/php:${{ matrix.version }}
tags: |
chialab/php-otel:${{ matrix.version }}
ghcr.io/chialab/php-otel:${{ matrix.version }}
push: true
16 changes: 16 additions & 0 deletions .github/workflows/test.8.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,19 @@ jobs:
REGISTRY: localhost:5000/
VERSION: ${{ matrix.version }}${{ matrix.flavor }}
run: 'docker pull localhost:5000/chialab/php-xhprof:${{ matrix.version }}${{ matrix.flavor }} && make -C xhprof test'

- name: Build OTel image for testing
uses: docker/build-push-action@v5
with:
cache-to: type=inline
context: ./otel
build-args: |
BASE_IMAGE=localhost:5000/chialab/php:${{ matrix.version }}${{ matrix.flavor }}
tags: localhost:5000/chialab/php-otel:${{ matrix.version }}${{ matrix.flavor }}
push: true

- name: Test OTel image
env:
REGISTRY: localhost:5000/
VERSION: ${{ matrix.version }}${{ matrix.flavor }}
run: 'docker pull localhost:5000/chialab/php-otel:${{ matrix.version }}${{ matrix.flavor }} && make -C otel test'
16 changes: 16 additions & 0 deletions .github/workflows/test.latest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -97,3 +97,19 @@ jobs:
REGISTRY: localhost:5000/
VERSION: ${{ matrix.version }}
run: 'docker pull localhost:5000/chialab/php-xhprof:${{ matrix.version }} && make -C xhprof test'

- name: Build OTel image for testing
uses: docker/build-push-action@v5
with:
cache-to: type=inline
context: ./otel
build-args: |
BASE_IMAGE=localhost:5000/chialab/php:${{ matrix.version }}
tags: localhost:5000/chialab/php-otel:${{ matrix.version }}
push: true

- name: Test OTel image
env:
REGISTRY: localhost:5000/
VERSION: ${{ matrix.version }}
run: 'docker pull localhost:5000/chialab/php-otel:${{ matrix.version }} && make -C otel test'
11 changes: 10 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,16 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update -q \
5.6.*) PHP_EXTENSIONS="$PHP_EXTENSIONS mcrypt mysql";; \
7.0.*|7.1.*) PHP_EXTENSIONS="$PHP_EXTENSIONS mcrypt";; \
esac \
&& install-php-extensions $PHP_EXTENSIONS \
# On PHP Debian 9 (Stretch) amqp has a dependency on libssh-dev, which pulls in
# libssl1.0-dev, which conflicts with the libssl-dev version (1.1.0) needed by the
# other extensions. Installing amqp on its own so that install-php-extensions
# purges libssl1.0-dev before libssl-dev is installed for the rest.
&& if [ "${PHP_VERSION%%.*}" = "7" ]; then \
install-php-extensions amqp \
&& install-php-extensions $(echo "$PHP_EXTENSIONS" | sed 's/amqp//'); \
else \
install-php-extensions $PHP_EXTENSIONS; \
fi \
&& if command -v a2enmod; then a2enmod rewrite; fi

# Install Composer.
Expand Down
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ An automated build is set up, so they should be always up-to-date with the Docke

For development environments, you might want to choose an [image with XDebug installed](https://hub.docker.com/r/chialab/php-dev/), or [one with XHProf](https://hub.docker.com/r/chialab/php-xhprof/), or another [with PCOV installed](https://hub.docker.com/r/chialab/php-pcov/), instead.

If you use Open Telemetry in your project, you may be interested in an [image with the OTel PHP extension](https://hub.docker.com/r/chialab/php-otel/).

If you are really desperate and need PHP 5.6 with support for MySQL 8.x, check the [php-compat](https://hub.docker.com/r/chialab/php-compat/) image.

## Available tags
Expand Down Expand Up @@ -49,6 +51,9 @@ If you are really desperate and need PHP 5.6 with support for MySQL 8.x, check t
- `8.4`
- `8.4-apache`
- `8.4-fpm`
- `8.5`
- `8.5-apache`
- `8.5-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.

Expand Down
9 changes: 9 additions & 0 deletions otel/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
ARG BASE_IMAGE=chialab/php:latest
FROM ${BASE_IMAGE}
LABEL maintainer="dev@chialab.io"

RUN if [ "$(echo "$PHP_VERSION" | cut -d. -f1,2)" = "8.0" ]; then \
install-php-extensions protobuf opentelemetry-php/ext-opentelemetry@1.1.3; \
else \
install-php-extensions protobuf opentelemetry-php/ext-opentelemetry@1.3.1; \
fi
80 changes: 80 additions & 0 deletions otel/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
SHELL := /bin/bash
ALL: build
.PHONY: build test push

PARENT_IMAGE := chialab/php
IMAGE := chialab/php-otel
VERSION ?= latest
PHP_VERSION = $(firstword $(subst -, ,$(VERSION)))
PHP_MAJOR := $(shell echo $(PHP_VERSION) | grep -oE '^[0-9]+')
ifneq ($(PHP_MAJOR),)
ifeq ($(shell [ $(PHP_MAJOR) -lt 8 ] && echo yes),yes)
$(error PHP_VERSION '$(PHP_VERSION)' is not supported: this image requires PHP >= 8.0)
endif
endif

# Extensions.
EXTENSIONS := \
amqp \
bcmath \
bz2 \
calendar \
event \
exif \
gd \
gettext \
iconv \
imagick \
intl \
ldap \
mbstring \
memcached \
mysqli \
OPcache \
opentelemetry \
pdo_mysql \
pdo_pgsql \
pgsql \
redis \
soap \
xsl \
zip \
sockets

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) sh -c '/bin/echo $$PHP_VERSION' | cut -d '.' -f 1,2`; \
if [[ "$(PHP_VERSION)" != "latest" && "$(PHP_VERSION)" != "alpine" && "$${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]'; \
exit 1; \
fi
@echo 'OK'

push:
docker image push $(REGISTRY)$(IMAGE):$(VERSION)
93 changes: 93 additions & 0 deletions otel/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<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/actions/workflow/status/chialab/docker-php/main.yml?branch=main&style=flat-square"></a>
<a href="https://github.com/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-otel/"><img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/chialab/php-otel.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-otel/) (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.

## Available tags
- `latest`
- `8.0`
- `8.0-apache`
- `8.0-fpm`
- `8.1`
- `8.1-apache`
- `8.1-fpm`
- `8.2`
- `8.2-apache`
- `8.2-fpm`
- `8.3`
- `8.3-apache`
- `8.3-fpm`
- `8.4`
- `8.4-apache`
- `8.4-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`
- `opentelemetry`
- `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.
Loading