Merge pull request #137 from chialab/otel-image

add image with open-telemetry PHP extension
This commit is contained in:
le0m
2026-07-27 14:35:26 +02:00
committed by GitHub
9 changed files with 255 additions and 1 deletions
+13
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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'
+10 -1
View File
@@ -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.
+5
View File
@@ -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
@@ -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.
+9
View File
@@ -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
View File
@@ -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
View File
@@ -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.