diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 959a61a5..f667f093 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,51 +9,153 @@ on: paths: - "alpine/**" - "debian/**" + - "images.json" workflow_dispatch: +env: + IMAGE_NAME: loeffelhardt/php + jobs: - build: + # Single source of truth: images.json. Derive two matrices from it: + # - build_matrix: one entry per (image, platform), with the native + # runner to use for that platform (no QEMU). + # - merge_matrix: one entry per image, with its final tags, used to + # assemble the multi-arch manifest after the platform builds. + prepare: runs-on: ubuntu-latest + outputs: + build_matrix: ${{ steps.matrices.outputs.build_matrix }} + merge_matrix: ${{ steps.matrices.outputs.merge_matrix }} + steps: + - uses: actions/checkout@v7 + + - name: Derive matrices from images.json + id: matrices + run: | + build_matrix=$(jq -c '{ + include: [ + .[] as $img + | $img.platforms[] as $p + | { + id: ($img.id | gsub("/"; "-")), + image: $img.dockerfile, + platform: $p, + runner: ( + if $p == "linux/amd64" then "ubuntu-24.04" + elif $p == "linux/arm64" then "ubuntu-24.04-arm" + else "ubuntu-latest" + end + ) + } + ] + }' images.json) + + merge_matrix=$(jq -c '{ + include: [ + .[] | { id: (.id | gsub("/"; "-")), tags: .tags } + ] + }' images.json) + + echo "build_matrix=${build_matrix}" >> "$GITHUB_OUTPUT" + echo "merge_matrix=${merge_matrix}" >> "$GITHUB_OUTPUT" + + # Build each image natively on amd64 and arm64 runners (no QEMU emulation, + # full native compile speed). On `main` each variant is pushed by digest + # (untagged); the `merge` job later assembles the multi-arch manifests. + build: + needs: prepare + runs-on: ${{ matrix.runner }} strategy: fail-fast: false - matrix: - include: - ## Alpine - ### Alpine 3.22 -# - image: "alpine/3.22/8.4/Dockerfile" -# tags: [ "loeffelhardt/php:8.4-alpine3.22" ] -# platforms: [ "linux/amd64", "linux/arm64" ] - - ### Alpine 3.23 - - image: "alpine/3.23/8.4/Dockerfile" -# tags: [ "loeffelhardt/php:latest", "loeffelhardt/php:8.4", "loeffelhardt/php:8.4-alpine3.23" ] - tags: [ "loeffelhardt/php:8.4-alpine3.23" ] - platforms: [ "linux/amd64", "linux/arm64" ] - - ## Debian - ### Debian bullseye -# - image: 'debian/bullseye/8.4/Dockerfile' -# tags: [ 'loeffelhardt/php:8.4-debian' ] -# platforms: [ "linux/amd64", "linux/arm64" ] + matrix: ${{ fromJson(needs.prepare.outputs.build_matrix) }} steps: - - name: Set up QEMU - uses: docker/setup-qemu-action@v4 + - uses: actions/checkout@v7 + + - name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> "$GITHUB_ENV" - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - name: Login to DockerHub + if: github.ref == 'refs/heads/main' uses: docker/login-action@v4 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - - name: Build and push - id: docker_build + # On main: push the single-platform image by digest (no tags yet). + - name: Build and push by digest + if: github.ref == 'refs/heads/main' + id: build_push uses: docker/build-push-action@v7 with: - push: ${{ github.ref == 'refs/heads/main' }} file: ${{ matrix.image }} - tags: ${{ join(matrix.tags) }} - platforms: ${{ join(matrix.platforms) }} + platforms: ${{ matrix.platform }} + outputs: type=image,name=${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true + + # On other branches/PRs: just build natively to validate, no push. + - name: Build (validate only) + if: github.ref != 'refs/heads/main' + uses: docker/build-push-action@v7 + with: + file: ${{ matrix.image }} + platforms: ${{ matrix.platform }} + push: false + + - name: Export digest + if: github.ref == 'refs/heads/main' + run: | + mkdir -p /tmp/digests + digest="${{ steps.build_push.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + if: github.ref == 'refs/heads/main' + uses: actions/upload-artifact@v7 + with: + name: digests-${{ matrix.id }}-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + # Assemble the final multi-arch manifest lists from the per-platform + # digests pushed above, tagging each image as defined in images.json. + merge: + if: github.ref == 'refs/heads/main' + needs: [ prepare, build ] + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.prepare.outputs.merge_matrix) }} + + steps: + - name: Download digests + uses: actions/download-artifact@v8 + with: + path: /tmp/digests + pattern: digests-${{ matrix.id }}-* + merge-multiple: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4 + + - name: Login to DockerHub + uses: docker/login-action@v4 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create \ + $(printf -- '-t %s ' ${{ join(matrix.tags, ' ') }}) \ + $(printf '${{ env.IMAGE_NAME }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ matrix.tags[0] }} diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..13f3faee --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +SHELL := /usr/bin/env bash +SCRIPT := scripts/build-images.sh + +.PHONY: help list login build push build-push clean + +help: ## Show this help + @echo "Usage: make [IMAGE=]" + @echo + @echo "IMAGE is an optional filter matched against the 'id' field in images.json" + @echo "(e.g. IMAGE=alpine/3.24/8.5, IMAGE=alpine, IMAGE=debian). Omit for all images." + @echo + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z0-9_-]+:.*?## / {printf " %-12s %s\n", $$1, $$2}' $(MAKEFILE_LIST) + +list: ## List all images/tags defined in images.json + @$(SCRIPT) list + +login: ## Log in to Docker Hub (prompts for username/password or token) + @$(SCRIPT) login + +build: ## Build images and warm the local buildx cache (no push). Use IMAGE= to filter. + @$(SCRIPT) build "$(IMAGE)" + +push: ## (Re)build from cache and push images to Docker Hub. Use IMAGE= to filter. + @$(SCRIPT) push "$(IMAGE)" + +build-push: build push ## Run build then push in sequence. + +clean: ## Remove the local buildx builder and cache + @$(SCRIPT) clean diff --git a/README.md b/README.md index fb94a168..8052a052 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,9 @@ Extends official Spryker PHP Docker images with extensions and tools to be able to run Löffelhardt. * Based on official PHP images - * `Alpine 3.22` * `Alpine 3.23` + * `Alpine 3.24` + * `Debian "bookworm"` * `Debian "bullseye"` * Users: `root`, `spryker` @@ -25,56 +26,16 @@ Extends official Spryker PHP Docker images with extensions and tools to be able | Tag | PHP version | Linux distribution | Details | Dockerfile | |:------------------------------------------------------------------------------------------------------|:------------|:-------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------| -| [loeffelhardt/php:latest](https://hub.docker.com/r/loeffelhardt/php/tags?name=latest) | 8.4.21 | Alpine 3.23 | [![](https://images.microbadger.com/badges/image/loeffelhardt/php:latest.svg)](https://microbadger.com/images/loeffelhardt/php:latest "Get your own image badge on microbadger.com") | [:link:](https://github.com/loeffelhardt/el-docker-php/blob/master/alpine/3.23/8.4/Dockerfile) | -| [loeffelhardt/php:8.4](https://hub.docker.com/r/loeffelhardt/php/tags?name=8.4) | 8.4.21 | Alpine 3.23 | [![](https://images.microbadger.com/badges/image/loeffelhardt/php:8.4.svg)](https://microbadger.com/images/loeffelhardt/php:8.4 "Get your own image badge on microbadger.com") | [:link:](https://github.com/loeffelhardt/el-docker-php/blob/master/alpine/3.23/8.4/Dockerfile) | -| [loeffelhardt/php:8.4-alpine3.23](https://hub.docker.com/r/loeffelhardt/php/tags?name=8.4-alpine3.23) | 8.4.21 | Alpine 3.23 | [![](https://images.microbadger.com/badges/image/loeffelhardt/php:8.4-alpine3.23.svg)](https://microbadger.com/images/loeffelhardt/php:8.4-alpine3.23 "Get your own image badge on microbadger.com") | [:link:](https://github.com/loeffelhardt/el-docker-php/blob/master/alpine/3.23/8.4/Dockerfile) | -| [loeffelhardt/php:8.4-alpine3.22](https://hub.docker.com/r/loeffelhardt/php/tags?name=8.4-alpine3.22) | 8.4.21 | Alpine 3.22 | [![](https://images.microbadger.com/badges/image/loeffelhardt/php:8.4-alpine3.22.svg)](https://microbadger.com/images/loeffelhardt/php:8.4-alpine3.22 "Get your own image badge on microbadger.com") | [:link:](https://github.com/loeffelhardt/el-docker-php/blob/master/alpine/3.22/8.4/Dockerfile) | +| [loeffelhardt/php:latest](https://hub.docker.com/r/loeffelhardt/php/tags?name=latest) | 8.5.9 | Alpine 3.24 | [![](https://images.microbadger.com/badges/image/loeffelhardt/php:8.5-alpine3.24.svg)](https://microbadger.com/images/loeffelhardt/php:8.5-alpine3.24 "Get your own image badge on microbadger.com") | [:link:](https://github.com/loeffelhardt/el-docker-php/blob/master/alpine/3.24/8.5/Dockerfile) | +| [loeffelhardt/php:8.5](https://hub.docker.com/r/loeffelhardt/php/tags?name=8.5) | 8.5.9 | Alpine 3.24 | [![](https://images.microbadger.com/badges/image/loeffelhardt/php:8.5-alpine3.24.svg)](https://microbadger.com/images/loeffelhardt/php:8.5-alpine3.24 "Get your own image badge on microbadger.com") | [:link:](https://github.com/loeffelhardt/el-docker-php/blob/master/alpine/3.24/8.5/Dockerfile) | +| [loeffelhardt/php:8.5-alpine3.24](https://hub.docker.com/r/loeffelhardt/php/tags?name=8.5-alpine3.24) | 8.5.9 | Alpine 3.24 | [![](https://images.microbadger.com/badges/image/loeffelhardt/php:8.5-alpine3.24.svg)](https://microbadger.com/images/loeffelhardt/php:8.5-alpine3.24 "Get your own image badge on microbadger.com") | [:link:](https://github.com/loeffelhardt/el-docker-php/blob/master/alpine/3.24/8.5/Dockerfile) | +| [loeffelhardt/php:8.4](https://hub.docker.com/r/loeffelhardt/php/tags?name=8.4) | 8.4.24 | Alpine 3.24 | [![](https://images.microbadger.com/badges/image/loeffelhardt/php:8.4-alpine3.24.svg)](https://microbadger.com/images/loeffelhardt/php:8.4-alpine3.24 "Get your own image badge on microbadger.com") | [:link:](https://github.com/loeffelhardt/el-docker-php/blob/master/alpine/3.24/8.4/Dockerfile) | +| [loeffelhardt/php:8.4-alpine3.24](https://hub.docker.com/r/loeffelhardt/php/tags?name=8.4-alpine3.24) | 8.4.24 | Alpine 3.24 | [![](https://images.microbadger.com/badges/image/loeffelhardt/php:8.4-alpine3.24.svg)](https://microbadger.com/images/loeffelhardt/php:8.4-alpine3.24 "Get your own image badge on microbadger.com") | [:link:](https://github.com/loeffelhardt/el-docker-php/blob/master/alpine/3.24/8.4/Dockerfile) | +| [loeffelhardt/php:8.4-alpine3.23](https://hub.docker.com/r/loeffelhardt/php/tags?name=8.4-alpine3.23) | 8.4.24 | Alpine 3.23 | [![](https://images.microbadger.com/badges/image/loeffelhardt/php:8.4-alpine3.23.svg)](https://microbadger.com/images/loeffelhardt/php:8.4-alpine3.23 "Get your own image badge on microbadger.com") | [:link:](https://github.com/loeffelhardt/el-docker-php/blob/master/alpine/3.23/8.4/Dockerfile) | +| [loeffelhardt/php:8.5-debian](https://hub.docker.com/r/loeffelhardt/php/tags?name=8.5-debian) | 8.5.9 | Debian "bookworm" | [![](https://images.microbadger.com/badges/image/loeffelhardt/php:8.5-debian.svg)](https://microbadger.com/images/loeffelhardt/php:8.5-debian "Get your own image badge on microbadger.com") | [:link:](https://github.com/loeffelhardt/el-docker-php/blob/master/debian/bookworm/8.5/Dockerfile) | | [loeffelhardt/php:8.4-debian](https://hub.docker.com/r/loeffelhardt/php/tags?name=8.4-debian) | 8.4.11 | Debian "bullseye" | [![](https://images.microbadger.com/badges/image/loeffelhardt/php:8.4-debian.svg)](https://microbadger.com/images/loeffelhardt/php:8.4-debian "Get your own image badge on microbadger.com") | [:link:](https://github.com/loeffelhardt/el-docker-php/blob/master/debian/bullseye/8.4/Dockerfile) | ## How to use -### Pull image -```bash -$ docker pull loeffelhardt/php -$ docker pull loeffelhardt/php:8.4 -``` - -### Run container -```bash -$ docker run -i --rm loeffelhardt/php:latest php -v -``` - -### Dockerfile -```dockerfile -FROM loeffelhardt/php:8.4 -``` - -### docker-compose.yml -```yaml -service1: - image: loeffelhardt/php:8.3-debian -``` - -### Enable NewRelic -```dockerfile -FROM loeffelhardt/php:8.4 - -RUN mv /usr/local/etc/php/disabled/newrelic.ini /usr/local/etc/php/conf.d/90-newrelic.ini -``` - -### Enable Blackfire -```dockerfile -FROM loeffelhardt/php:8.4 - -RUN mv /usr/local/etc/php/disabled/blackfire.ini /usr/local/etc/php/conf.d/90-blackfire.ini -``` - -### Enable Tideways -```dockerfile -FROM loeffelhardt/php:8.4 - -RUN mv /usr/local/etc/php/disabled/tideways.ini /usr/local/etc/php/conf.d/90-tideways.ini -``` - ## PHP extensions ``` @@ -161,10 +122,10 @@ Disabled extensions [ ] blackfire 1.87.1~linux-musl-x64-non_zts82 [ ] excimer 1.2.5 [ ] imagick 3.8.1 - [ ] newrelic 12.8.0.37 + [ ] newrelic 12.9.0.38 [ ] otel [ ] pcov 1.0.12 - [ ] tideways 5.32.0-d1af5cc + [ ] tideways 5.42.0 [ ] xhprof 2.3.10 INSTALLED PACKAGES, CHANNEL PECL.PHP.NET: @@ -181,7 +142,7 @@ xhprof 2.3.10 stable Composer ==================== -Composer version 2.9.8 2025-12-30 13:40:17 +Composer version 2.10.2 ``` ##### Run the following to get the report ```bash diff --git a/alpine/3.21/8.2/Dockerfile b/alpine/3.21/8.2/Dockerfile index 0641eb21..1399a173 100644 --- a/alpine/3.21/8.2/Dockerfile +++ b/alpine/3.21/8.2/Dockerfile @@ -3,11 +3,11 @@ ARG SPRYKER_PHP_VERSION=8.2.29 FROM php:${SPRYKER_PHP_VERSION}-fpm-alpine3.21 ARG TARGETPLATFORM -ARG COMPOSER_VERSION=2.9.8 +ARG COMPOSER_VERSION=2.10.2 ARG BLACKFIRE_VERSION=1.87.1 ARG BLACKFIRE_PHP_VERSION=82 -ARG NEWRELIC_VERSION=12.8.0.37 -ARG TIDEWAYS_VERSION=5.32.0 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 ARG TIDEWAYS_PHP_VERSION=8.2 ENV srcRoot /data diff --git a/alpine/3.21/8.3/Dockerfile b/alpine/3.21/8.3/Dockerfile index 6e4198b3..430edaa3 100644 --- a/alpine/3.21/8.3/Dockerfile +++ b/alpine/3.21/8.3/Dockerfile @@ -3,11 +3,11 @@ ARG SPRYKER_PHP_VERSION=8.3.28 FROM php:${SPRYKER_PHP_VERSION}-fpm-alpine3.21 ARG TARGETPLATFORM -ARG COMPOSER_VERSION=2.9.8 +ARG COMPOSER_VERSION=2.10.2 ARG BLACKFIRE_VERSION=1.92.48 ARG BLACKFIRE_PHP_VERSION=83 -ARG NEWRELIC_VERSION=12.8.0.37 -ARG TIDEWAYS_VERSION=5.32.0 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 ARG TIDEWAYS_PHP_VERSION=8.3 ENV srcRoot /data diff --git a/alpine/3.21/8.4/Dockerfile b/alpine/3.21/8.4/Dockerfile index 2e536dfa..ccb016d7 100644 --- a/alpine/3.21/8.4/Dockerfile +++ b/alpine/3.21/8.4/Dockerfile @@ -3,11 +3,11 @@ ARG SPRYKER_PHP_VERSION=8.4.15 FROM php:${SPRYKER_PHP_VERSION}-fpm-alpine3.21 ARG TARGETPLATFORM -ARG COMPOSER_VERSION=2.9.8 +ARG COMPOSER_VERSION=2.10.2 ARG BLACKFIRE_VERSION=1.92.48 ARG BLACKFIRE_PHP_VERSION=84 -ARG NEWRELIC_VERSION=12.8.0.37 -ARG TIDEWAYS_VERSION=5.32.0 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 ARG TIDEWAYS_PHP_VERSION=8.4 ENV srcRoot /data diff --git a/alpine/3.22/8.2/Dockerfile b/alpine/3.22/8.2/Dockerfile index e18032e7..4410087b 100644 --- a/alpine/3.22/8.2/Dockerfile +++ b/alpine/3.22/8.2/Dockerfile @@ -3,11 +3,11 @@ ARG SPRYKER_PHP_VERSION=8.2.31 FROM php:${SPRYKER_PHP_VERSION}-fpm-alpine3.22 ARG TARGETPLATFORM -ARG COMPOSER_VERSION=2.9.8 +ARG COMPOSER_VERSION=2.10.2 ARG BLACKFIRE_VERSION=1.87.1 ARG BLACKFIRE_PHP_VERSION=82 -ARG NEWRELIC_VERSION=12.8.0.37 -ARG TIDEWAYS_VERSION=5.32.0 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 ARG TIDEWAYS_PHP_VERSION=8.2 ENV srcRoot /data diff --git a/alpine/3.22/8.3/Dockerfile b/alpine/3.22/8.3/Dockerfile index 25eb9f29..8d628683 100644 --- a/alpine/3.22/8.3/Dockerfile +++ b/alpine/3.22/8.3/Dockerfile @@ -3,11 +3,11 @@ ARG SPRYKER_PHP_VERSION=8.3.31 FROM php:${SPRYKER_PHP_VERSION}-fpm-alpine3.22 ARG TARGETPLATFORM -ARG COMPOSER_VERSION=2.9.8 +ARG COMPOSER_VERSION=2.10.2 ARG BLACKFIRE_VERSION=1.92.48 ARG BLACKFIRE_PHP_VERSION=83 -ARG NEWRELIC_VERSION=12.8.0.37 -ARG TIDEWAYS_VERSION=5.32.0 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 ARG TIDEWAYS_PHP_VERSION=8.3 ENV srcRoot /data diff --git a/alpine/3.22/8.4/Dockerfile b/alpine/3.22/8.4/Dockerfile index aad8ca95..a8f9902d 100644 --- a/alpine/3.22/8.4/Dockerfile +++ b/alpine/3.22/8.4/Dockerfile @@ -1,13 +1,13 @@ # syntax = docker/dockerfile:1.0.2-experimental -ARG SPRYKER_PHP_VERSION=8.4.21 +ARG SPRYKER_PHP_VERSION=8.4.22 FROM php:${SPRYKER_PHP_VERSION}-fpm-alpine3.22 ARG TARGETPLATFORM -ARG COMPOSER_VERSION=2.9.8 +ARG COMPOSER_VERSION=2.10.2 ARG BLACKFIRE_VERSION=1.92.48 ARG BLACKFIRE_PHP_VERSION=84 -ARG NEWRELIC_VERSION=12.8.0.37 -ARG TIDEWAYS_VERSION=5.32.0 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 ARG TIDEWAYS_PHP_VERSION=8.4 ENV srcRoot /data diff --git a/alpine/3.23/8.2/Dockerfile b/alpine/3.23/8.2/Dockerfile index 828b2f10..03d3a58a 100644 --- a/alpine/3.23/8.2/Dockerfile +++ b/alpine/3.23/8.2/Dockerfile @@ -1,13 +1,13 @@ # syntax = docker/dockerfile:1.0.2-experimental -ARG SPRYKER_PHP_VERSION=8.2.31 +ARG SPRYKER_PHP_VERSION=8.2.33 FROM php:${SPRYKER_PHP_VERSION}-fpm-alpine3.23 ARG TARGETPLATFORM -ARG COMPOSER_VERSION=2.9.8 +ARG COMPOSER_VERSION=2.10.2 ARG BLACKFIRE_VERSION=1.87.1 ARG BLACKFIRE_PHP_VERSION=82 -ARG NEWRELIC_VERSION=12.8.0.37 -ARG TIDEWAYS_VERSION=5.32.0 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 ARG TIDEWAYS_PHP_VERSION=8.2 ENV srcRoot /data diff --git a/alpine/3.23/8.3/Dockerfile b/alpine/3.23/8.3/Dockerfile index a238fa8e..077e8cd4 100644 --- a/alpine/3.23/8.3/Dockerfile +++ b/alpine/3.23/8.3/Dockerfile @@ -1,13 +1,13 @@ # syntax = docker/dockerfile:1.0.2-experimental -ARG SPRYKER_PHP_VERSION=8.3.31 +ARG SPRYKER_PHP_VERSION=8.3.33 FROM php:${SPRYKER_PHP_VERSION}-fpm-alpine3.23 ARG TARGETPLATFORM -ARG COMPOSER_VERSION=2.9.8 +ARG COMPOSER_VERSION=2.10.2 ARG BLACKFIRE_VERSION=1.92.48 ARG BLACKFIRE_PHP_VERSION=83 -ARG NEWRELIC_VERSION=12.8.0.37 -ARG TIDEWAYS_VERSION=5.32.0 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 ARG TIDEWAYS_PHP_VERSION=8.3 ENV srcRoot /data diff --git a/alpine/3.23/8.4/Dockerfile b/alpine/3.23/8.4/Dockerfile index 16c0d9b9..8aa97866 100644 --- a/alpine/3.23/8.4/Dockerfile +++ b/alpine/3.23/8.4/Dockerfile @@ -1,13 +1,13 @@ # syntax = docker/dockerfile:1.0.2-experimental -ARG SPRYKER_PHP_VERSION=8.4.21 +ARG SPRYKER_PHP_VERSION=8.4.24 FROM php:${SPRYKER_PHP_VERSION}-fpm-alpine3.23 ARG TARGETPLATFORM -ARG COMPOSER_VERSION=2.9.8 +ARG COMPOSER_VERSION=2.10.2 ARG BLACKFIRE_VERSION=1.92.48 ARG BLACKFIRE_PHP_VERSION=84 -ARG NEWRELIC_VERSION=12.8.0.37 -ARG TIDEWAYS_VERSION=5.32.0 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 ARG TIDEWAYS_PHP_VERSION=8.4 ENV srcRoot /data diff --git a/alpine/3.24/8.2/Dockerfile b/alpine/3.24/8.2/Dockerfile new file mode 100644 index 00000000..c15fff80 --- /dev/null +++ b/alpine/3.24/8.2/Dockerfile @@ -0,0 +1,222 @@ +# syntax = docker/dockerfile:1.0.2-experimental +ARG SPRYKER_PHP_VERSION=8.2.33 +FROM php:${SPRYKER_PHP_VERSION}-fpm-alpine3.24 + +ARG TARGETPLATFORM +ARG COMPOSER_VERSION=2.10.2 +ARG BLACKFIRE_VERSION=1.87.1 +ARG BLACKFIRE_PHP_VERSION=82 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 +ARG TIDEWAYS_PHP_VERSION=8.2 + +ENV srcRoot /data +RUN mkdir -p ${srcRoot} + +ARG PHP_RUN_DEPS="\ + freetype \ + gmp \ + gnu-libiconv \ + icu-libs \ + libavif \ + libbz2 \ + libc6-compat \ + libjpeg-turbo \ + libpng \ + libwebp \ + libxml2 \ + libxpm \ + libxslt \ + libzip \ + rabbitmq-c \ + imagemagick" + +ARG PHP_BUILD_DEPS="\ + autoconf \ + bzip2-dev \ + freetype-dev \ + gmp-dev \ + icu-dev \ + icu-data-full \ + libavif-dev \ + libjpeg-turbo-dev \ + libpng-dev \ + libwebp-dev \ + libxml2-dev \ + libxpm-dev \ + libxslt-dev \ + libzip-dev \ + postgresql-dev \ + rabbitmq-c-dev \ + g++ \ + imagemagick-dev" + +ARG PHP_EXTENSIONS="\ + bcmath \ + bz2 \ + ftp \ + gd \ + gmp \ + intl \ + mysqli \ + opcache \ + pcntl \ + pdo_mysql \ + pdo_pgsql \ + pgsql \ + soap \ + sockets \ + xsl \ + zip" + +ARG PHP_PECL_EXTENSIONS="\ + apcu \ + redis" + +ARG ADDITIONAL_PHP_PECL_EXTENSIONS="\ + pcov \ + xdebug \ + xhprof \ + excimer \ + amqp \ + imagick" + +ARG GRAPHVIZ_BUILD_DEPS="\ + expat-dev" + +ARG CFLAGS="-I/usr/src/php" +RUN apk update \ + && apk upgrade \ + && apk add --no-cache \ + bash \ + coreutils \ + curl \ + g++ \ + git \ + make \ + mysql-client \ + netcat-openbsd \ + openssh \ + postgresql-client \ + procps \ + python3 \ + shadow \ + unzip \ + linux-headers \ + libstdc++ \ + openssl-dev \ + zlib-dev \ + scdoc \ + ${PHP_RUN_DEPS} \ + && apk add --no-cache --virtual .php-build-deps ${PHP_BUILD_DEPS} \ + && apk add --no-cache --virtual .graphviz-build-deps ${GRAPHVIZ_BUILD_DEPS} \ + && rm -rf /var/lib/apt/lists/ \ + && cd /tmp \ + && git clone --depth 1 --branch v3.0.0_rc7 https://github.com/alpinelinux/apk-tools.git apk-tools-v3.0.0_rc7 \ + && cd apk-tools-v3.0.0_rc7 && make LUA=no && make LUA=no install \ + && cd /tmp \ + && curl -LO https://github.com/unicode-org/icu/releases/download/release-74-1/icu4c-74_1-src.tgz \ + && tar xzf icu4c-74_1-src.tgz \ + && cd icu/source && ./configure --prefix=/usr && make && make install \ + && cd /tmp \ + && rm -rf /tmp/apk-tools-v3.0.0_rc7 /tmp/icu4c-74_1-src.tgz /tmp/icu \ + && docker-php-ext-configure gd \ + --disable-gd-jis-conv \ + --with-avif=/usr \ + --with-freetype=/usr \ + --with-jpeg=/usr \ + --with-webp=/usr \ + --with-xpm=/usr \ + && docker-php-ext-install -j5 ${PHP_EXTENSIONS} \ + && pecl install -o -f ${PHP_PECL_EXTENSIONS} ${ADDITIONAL_PHP_PECL_EXTENSIONS} \ + && rm -rf /tmp/pear \ + && docker-php-ext-enable ${PHP_EXTENSIONS} ${PHP_PECL_EXTENSIONS} \ + && apk del --no-cache .php-build-deps \ + && rm -rf /tmp/icu* + +# Related to https://github.com/docker-library/php/issues/240 +ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so + +# Blackfire +ENV BLACKFIRE_AGENT_SOCKET='' +RUN architecture=$(case ${TARGETPLATFORM} in "linux/amd64") echo "amd64" ;; linux/arm64) echo "arm64" ;; *) echo "amd64" ;; esac) \ + && curl -A "Docker" -o /tmp/blackfire.so -D - -L -s https://packages.blackfire.io/binaries/blackfire-php/${BLACKFIRE_VERSION}/blackfire-php-alpine_${architecture}-php-${BLACKFIRE_PHP_VERSION}.so \ + && mv /tmp/blackfire.so $(php -r "echo ini_get ('extension_dir');")/blackfire.so + +# New Relic +ENV NEWRELIC_ENABLED=0 +ENV NEWRELIC_LICENSE='' +ENV NEWRELIC_APPNAME='Spryker' +ENV NEWRELIC_DISTRIBUTED_TRACING_ENABLED=0 +ENV NEWRELIC_TRANSACTION_TRACER_ENABLED=0 +ENV NEWRELIC_SPAN_EVENTS_ENABLED=0 +ENV NEWRELIC_TRANSACTION_TRACER_THRESHOLD=0 +ENV NEWRELIC_DISTRIBUTED_TRACING_EXCLUDE_NEWRELIC_HEADER=0 + +RUN bash -c 'curl -L "https://download.newrelic.com/php_agent/archive/${NEWRELIC_VERSION}/newrelic-php5-${NEWRELIC_VERSION}-linux-musl.tar.gz" | tar -C /tmp -zx \ + && export NR_INSTALL_USE_CP_NOT_LN=1 \ + && export NR_INSTALL_SILENT=1 \ + && /tmp/newrelic-php5-*/newrelic-install install \ + && rm -rf /tmp/newrelic-php5-* /tmp/nrinstall* \ + && /usr/bin/install -d -m 777 /var/log/newrelic/ \ + && rm /usr/local/etc/php/conf.d/newrelic.ini' + +# Tideways +ENV TIDEWAYS_APIKEY='' +ENV TIDEWAYS_DAEMON_URI='' +ENV TIDEWAYS_CLI_ENABLED=0 +RUN bash -c 'if [ "${TARGETPLATFORM}" == "linux/amd64" ]; then \ + wget "https://s3-eu-west-1.amazonaws.com/tideways/extension/${TIDEWAYS_VERSION}/tideways-php-${TIDEWAYS_VERSION}-alpine-x86_64.tar.gz" \ + && tar xvzf tideways-php-${TIDEWAYS_VERSION}-alpine-x86_64.tar.gz \ + && cp ./tideways-php-${TIDEWAYS_VERSION}/tideways-php-alpine-${TIDEWAYS_PHP_VERSION}.so $(php-config --extension-dir)/tideways.so; fi' + +RUN bash -c 'if [ "${TARGETPLATFORM}" == "linux/arm64" ]; then \ + wget "https://s3-eu-west-1.amazonaws.com/tideways/extension/${TIDEWAYS_VERSION}/tideways-php-${TIDEWAYS_VERSION}-alpine-arm64.tar.gz" \ + && tar xvzf tideways-php-${TIDEWAYS_VERSION}-alpine-arm64.tar.gz \ + && cp ./tideways-php-${TIDEWAYS_VERSION}/tideways-php-alpine-${TIDEWAYS_PHP_VERSION}.so $(php-config --extension-dir)/tideways.so; fi' + +#GraphViz 7.0.5 +RUN cd /tmp && \ + curl -L https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/7.0.5/graphviz-7.0.5.tar.gz | tar -zx && \ + cd /tmp/graphviz-7.0.5 && \ + ./configure && \ + make && \ + make install && \ + rm -rf /tmp/graphviz-7.0.5 && \ + apk del --no-cache .graphviz-build-deps + +# Opcache +RUN /usr/bin/install -d -m 777 /var/run/opcache + +# Remove default FPM pool +RUN rm /usr/local/etc/php-fpm.d/www.conf && \ + rm /usr/local/etc/php-fpm.d/docker.conf && \ + rm /usr/local/etc/php-fpm.d/zz-docker.conf + +# Add FPM configs +COPY context/php/php-fpm.d/worker.conf /usr/local/etc/php-fpm.d/worker.conf +COPY context/php/php-fpm.conf /usr/local/etc/php-fpm.conf + +# Copy php.ini configuration +COPY context/php/php.ini /usr/local/etc/php/ +COPY context/php/conf.d/90-opcache.ini /usr/local/etc/php/conf.d/ +COPY context/php/conf.d/92-session.ini /usr/local/etc/php/conf.d/ +COPY context/php/disabled /usr/local/etc/php/disabled + +WORKDIR /data + +# Install composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer --version=${COMPOSER_VERSION} + +# Create application user 'spryker' +RUN addgroup spryker && \ + adduser -h /home/spryker -s /bin/sh -G www-data -D spryker && \ + chown spryker:spryker ${srcRoot} + +USER spryker +ENV COMPOSER_MEMORY_LIMIT=-1 +RUN mkdir -p /home/spryker/.composer +RUN bash -c '[[ $COMPOSER_VERSION == "1"* ]] && composer global require hirak/prestissimo && rm -rf /home/spryker/.composer/cache || true' + +USER root + diff --git a/alpine/3.24/8.3/Dockerfile b/alpine/3.24/8.3/Dockerfile new file mode 100644 index 00000000..ca7b4b12 --- /dev/null +++ b/alpine/3.24/8.3/Dockerfile @@ -0,0 +1,235 @@ +# syntax = docker/dockerfile:1.0.2-experimental +ARG SPRYKER_PHP_VERSION=8.3.33 +FROM php:${SPRYKER_PHP_VERSION}-fpm-alpine3.24 + +ARG TARGETPLATFORM +ARG COMPOSER_VERSION=2.10.2 +ARG BLACKFIRE_VERSION=1.92.48 +ARG BLACKFIRE_PHP_VERSION=83 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 +ARG TIDEWAYS_PHP_VERSION=8.3 + +ENV srcRoot /data +RUN mkdir -p ${srcRoot} + +ARG PHP_RUN_DEPS="\ + freetype \ + gmp \ + gnu-libiconv \ + icu-libs \ + libavif \ + libbz2 \ + libc6-compat \ + libjpeg-turbo \ + libpng \ + libwebp \ + libxml2 \ + libxpm \ + libxslt \ + libzip \ + rabbitmq-c \ + imagemagick" + +ARG PHP_BUILD_DEPS="\ + autoconf \ + bzip2-dev \ + freetype-dev \ + gmp-dev \ + icu-dev \ + icu-data-full \ + libavif-dev \ + libjpeg-turbo-dev \ + libpng-dev \ + libwebp-dev \ + libxml2-dev \ + libxpm-dev \ + libxslt-dev \ + libzip-dev \ + postgresql-dev \ + rabbitmq-c-dev \ + g++ \ + imagemagick-dev" + +ARG PHP_EXTENSIONS="\ + bcmath \ + bz2 \ + ftp \ + gd \ + gmp \ + intl \ + mysqli \ + opcache \ + pcntl \ + pdo_mysql \ + pdo_pgsql \ + pgsql \ + soap \ + sockets \ + xsl \ + zip" + +ARG PHP_PECL_EXTENSIONS="\ + apcu \ + redis" + +ARG ADDITIONAL_PHP_PECL_EXTENSIONS="\ + pcov \ + xdebug \ + xhprof \ + excimer \ + amqp \ + imagick" + +ARG GRAPHVIZ_BUILD_DEPS="\ + expat-dev" + +ARG CFLAGS="-I/usr/src/php" +RUN apk update \ + && apk upgrade \ + && apk add --no-cache \ + bash \ + coreutils \ + curl \ + g++ \ + git \ + make \ + mysql-client \ + netcat-openbsd \ + openssh \ + postgresql-client \ + procps \ + python3 \ + shadow \ + unzip \ + linux-headers \ + libstdc++ \ + openssl-dev \ + zlib-dev \ + scdoc \ + ${PHP_RUN_DEPS} \ + && apk add --no-cache --virtual .php-build-deps ${PHP_BUILD_DEPS} \ + && apk add --no-cache --virtual .graphviz-build-deps ${GRAPHVIZ_BUILD_DEPS} \ + && rm -rf /var/lib/apt/lists/ \ + && cd /tmp \ + && git clone --depth 1 --branch v3.0.0_rc7 https://github.com/alpinelinux/apk-tools.git apk-tools-v3.0.0_rc7 \ + && cd apk-tools-v3.0.0_rc7 && make LUA=no && make LUA=no install \ + && cd /tmp \ + && curl -LO https://github.com/unicode-org/icu/releases/download/release-74-1/icu4c-74_1-src.tgz \ + && tar xzf icu4c-74_1-src.tgz \ + && cd icu/source && ./configure --prefix=/usr && make && make install \ + && cd /tmp \ + && rm -rf /tmp/apk-tools-v3.0.0_rc7 /tmp/icu4c-74_1-src.tgz /tmp/icu \ + && docker-php-ext-configure gd \ + --disable-gd-jis-conv \ + --with-avif=/usr \ + --with-freetype=/usr \ + --with-jpeg=/usr \ + --with-webp=/usr \ + --with-xpm=/usr \ + && docker-php-ext-install -j5 ${PHP_EXTENSIONS} \ + && pecl install -o -f ${PHP_PECL_EXTENSIONS} ${ADDITIONAL_PHP_PECL_EXTENSIONS} \ + && rm -rf /tmp/pear \ + && docker-php-ext-enable ${PHP_EXTENSIONS} ${PHP_PECL_EXTENSIONS} \ + && apk del --no-cache .php-build-deps \ + && rm -rf /tmp/icu* + +# Related to https://github.com/docker-library/php/issues/240 +ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so + +# Otel +RUN echo "https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/community" >> /etc/apk/repositories +RUN PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;") \ + && apk add --no-cache \ + php${PHP_VERSION}-pecl-grpc \ + php${PHP_VERSION}-pecl-protobuf \ + php${PHP_VERSION}-pecl-opentelemetry + +RUN PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;") \ + && EXT_DIR=$(php -r "echo ini_get('extension_dir');") \ + && ln -s /usr/lib/php${PHP_VERSION}/modules/grpc.so $EXT_DIR/grpc.so \ + && ln -s /usr/lib/php${PHP_VERSION}/modules/protobuf.so $EXT_DIR/protobuf.so \ + && ln -s /usr/lib/php${PHP_VERSION}/modules/opentelemetry.so $EXT_DIR/opentelemetry.so + +## Blackfire +ENV BLACKFIRE_AGENT_SOCKET='' +RUN architecture=$(case ${TARGETPLATFORM} in "linux/amd64") echo "amd64" ;; linux/arm64) echo "arm64" ;; *) echo "amd64" ;; esac) \ + && curl -A "Docker" -o /tmp/blackfire.so -D - -L -s https://packages.blackfire.io/binaries/blackfire-php/${BLACKFIRE_VERSION}/blackfire-php-alpine_${architecture}-php-${BLACKFIRE_PHP_VERSION}.so \ + && mv /tmp/blackfire.so $(php -r "echo ini_get ('extension_dir');")/blackfire.so + +# New Relic +ENV NEWRELIC_ENABLED=0 +ENV NEWRELIC_LICENSE='' +ENV NEWRELIC_APPNAME='Spryker' +ENV NEWRELIC_DISTRIBUTED_TRACING_ENABLED=0 +ENV NEWRELIC_TRANSACTION_TRACER_ENABLED=0 +ENV NEWRELIC_SPAN_EVENTS_ENABLED=0 +ENV NEWRELIC_TRANSACTION_TRACER_THRESHOLD=0 +ENV NEWRELIC_DISTRIBUTED_TRACING_EXCLUDE_NEWRELIC_HEADER=0 + +RUN bash -c 'curl -L "https://download.newrelic.com/php_agent/archive/${NEWRELIC_VERSION}/newrelic-php5-${NEWRELIC_VERSION}-linux-musl.tar.gz" | tar -C /tmp -zx \ + && export NR_INSTALL_USE_CP_NOT_LN=1 \ + && export NR_INSTALL_SILENT=1 \ + && /tmp/newrelic-php5-*/newrelic-install install \ + && rm -rf /tmp/newrelic-php5-* /tmp/nrinstall* \ + && /usr/bin/install -d -m 777 /var/log/newrelic/ \ + && rm /usr/local/etc/php/conf.d/newrelic.ini' + +# Tideways +ENV TIDEWAYS_APIKEY='' +ENV TIDEWAYS_DAEMON_URI='' +ENV TIDEWAYS_CLI_ENABLED=0 +RUN bash -c 'if [ "${TARGETPLATFORM}" == "linux/amd64" ]; then \ + wget "https://s3-eu-west-1.amazonaws.com/tideways/extension/${TIDEWAYS_VERSION}/tideways-php-${TIDEWAYS_VERSION}-alpine-x86_64.tar.gz" \ + && tar xvzf tideways-php-${TIDEWAYS_VERSION}-alpine-x86_64.tar.gz \ + && cp ./tideways-php-${TIDEWAYS_VERSION}/tideways-php-alpine-${TIDEWAYS_PHP_VERSION}.so $(php-config --extension-dir)/tideways.so; fi' + +RUN bash -c 'if [ "${TARGETPLATFORM}" == "linux/arm64" ]; then \ + wget "https://s3-eu-west-1.amazonaws.com/tideways/extension/${TIDEWAYS_VERSION}/tideways-php-${TIDEWAYS_VERSION}-alpine-arm64.tar.gz" \ + && tar xvzf tideways-php-${TIDEWAYS_VERSION}-alpine-arm64.tar.gz \ + && cp ./tideways-php-${TIDEWAYS_VERSION}/tideways-php-alpine-${TIDEWAYS_PHP_VERSION}.so $(php-config --extension-dir)/tideways.so; fi' + +# GraphViz 7.0.5 +RUN cd /tmp && \ + curl -L https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/7.0.5/graphviz-7.0.5.tar.gz | tar -zx && \ + cd /tmp/graphviz-7.0.5 && \ + ./configure && \ + make && \ + make install && \ + rm -rf /tmp/graphviz-7.0.5 && \ + apk del --no-cache .graphviz-build-deps + +# Opcache +RUN /usr/bin/install -d -m 777 /var/run/opcache + +# Remove default FPM pool +RUN rm /usr/local/etc/php-fpm.d/www.conf && \ + rm /usr/local/etc/php-fpm.d/docker.conf && \ + rm /usr/local/etc/php-fpm.d/zz-docker.conf + +# Add FPM configs +COPY context/php/php-fpm.d/worker.conf /usr/local/etc/php-fpm.d/worker.conf +COPY context/php/php-fpm.conf /usr/local/etc/php-fpm.conf + +# Copy php.ini configuration +COPY context/php/php.ini /usr/local/etc/php/ +COPY context/php/conf.d/90-opcache.ini /usr/local/etc/php/conf.d/ +COPY context/php/conf.d/92-session.ini /usr/local/etc/php/conf.d/ +COPY context/php/disabled /usr/local/etc/php/disabled + +WORKDIR /data + +# Install composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer --version=${COMPOSER_VERSION} + +# Create application user 'spryker' +RUN addgroup spryker && \ + adduser -h /home/spryker -s /bin/sh -G www-data -D spryker && \ + chown spryker:spryker ${srcRoot} + +USER spryker +ENV COMPOSER_MEMORY_LIMIT=-1 +RUN mkdir -p /home/spryker/.composer +RUN bash -c '[[ $COMPOSER_VERSION == "1"* ]] && composer global require hirak/prestissimo && rm -rf /home/spryker/.composer/cache || true' + +USER root diff --git a/alpine/3.24/8.4/Dockerfile b/alpine/3.24/8.4/Dockerfile new file mode 100644 index 00000000..99d8089b --- /dev/null +++ b/alpine/3.24/8.4/Dockerfile @@ -0,0 +1,242 @@ +# syntax = docker/dockerfile:1.0.2-experimental +ARG SPRYKER_PHP_VERSION=8.4.24 +FROM php:${SPRYKER_PHP_VERSION}-fpm-alpine3.24 + +ARG TARGETPLATFORM +ARG COMPOSER_VERSION=2.10.2 +ARG BLACKFIRE_VERSION=1.92.48 +ARG BLACKFIRE_PHP_VERSION=84 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 +ARG TIDEWAYS_PHP_VERSION=8.4 + +ENV srcRoot /data +RUN mkdir -p ${srcRoot} + +ARG PHP_RUN_DEPS="\ + freetype \ + gmp \ + gnu-libiconv \ + icu-libs \ + libavif \ + libbz2 \ + libc6-compat \ + libjpeg-turbo \ + libpng \ + libwebp \ + libxml2 \ + libxpm \ + libxslt \ + libzip \ + rabbitmq-c \ + imagemagick" + +ARG PHP_BUILD_DEPS="\ + autoconf \ + bzip2-dev \ + freetype-dev \ + gmp-dev \ + icu-dev \ + icu-data-full \ + libavif-dev \ + libjpeg-turbo-dev \ + libpng-dev \ + libwebp-dev \ + libxml2-dev \ + libxpm-dev \ + libxslt-dev \ + libzip-dev \ + postgresql-dev \ + rabbitmq-c-dev \ + g++ \ + imagemagick-dev" + +ARG PHP_EXTENSIONS="\ + bcmath \ + bz2 \ + ftp \ + gd \ + gmp \ + intl \ + mysqli \ + opcache \ + pcntl \ + pdo_mysql \ + pdo_pgsql \ + pgsql \ + soap \ + sockets \ + xsl \ + zip" + +ARG PHP_PECL_EXTENSIONS="\ + apcu \ + redis" + +ARG ADDITIONAL_PHP_PECL_EXTENSIONS="\ + pcov \ + xdebug \ + xhprof \ + excimer \ + amqp \ + imagick" + +ARG GRAPHVIZ_BUILD_DEPS="\ + expat-dev" + +ARG CFLAGS="-I/usr/src/php" +RUN apk update \ + && apk upgrade \ + && apk add --no-cache \ + bash \ + coreutils \ + curl \ + g++ \ + git \ + make \ + mysql-client \ + netcat-openbsd \ + openssh \ + postgresql-client \ + procps \ + python3 \ + shadow \ + unzip \ + linux-headers \ + libstdc++ \ + openssl-dev \ + zlib-dev \ + scdoc \ + ${PHP_RUN_DEPS} \ + && apk add --no-cache --virtual .php-build-deps ${PHP_BUILD_DEPS} \ + && apk add --no-cache --virtual .graphviz-build-deps ${GRAPHVIZ_BUILD_DEPS} \ + && rm -rf /var/lib/apt/lists/ \ + && cd /tmp \ + && git clone --depth 1 --branch v3.0.0_rc7 https://github.com/alpinelinux/apk-tools.git apk-tools-v3.0.0_rc7 \ + && cd apk-tools-v3.0.0_rc7 && make LUA=no && make LUA=no install \ + && cd /tmp \ + && curl -LO https://github.com/unicode-org/icu/releases/download/release-74-1/icu4c-74_1-src.tgz \ + && tar xzf icu4c-74_1-src.tgz \ + && cd icu/source && ./configure --prefix=/usr && make && make install \ + && cd /tmp \ + && rm -rf /tmp/apk-tools-v3.0.0_rc7 /tmp/icu4c-74_1-src.tgz /tmp/icu \ + && docker-php-ext-configure gd \ + --disable-gd-jis-conv \ + --with-avif=/usr \ + --with-freetype=/usr \ + --with-jpeg=/usr \ + --with-webp=/usr \ + --with-xpm=/usr \ + && docker-php-ext-install -j5 ${PHP_EXTENSIONS} \ + && pecl install -o -f ${PHP_PECL_EXTENSIONS} ${ADDITIONAL_PHP_PECL_EXTENSIONS} \ + && rm -rf /tmp/pear \ + && docker-php-ext-enable ${PHP_EXTENSIONS} ${PHP_PECL_EXTENSIONS} \ + && apk del --no-cache .php-build-deps \ + && rm -rf /tmp/icu* + +# Related to https://github.com/docker-library/php/issues/240 +ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so + +# Otel +RUN echo "https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/community" >> /etc/apk/repositories +RUN PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;") \ + && apk add --no-cache \ + php${PHP_VERSION}-pecl-grpc \ + php${PHP_VERSION}-pecl-protobuf \ + php${PHP_VERSION}-pecl-opentelemetry + +RUN PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;") \ + && EXT_DIR=$(php -r "echo ini_get('extension_dir');") \ + && ln -s /usr/lib/php${PHP_VERSION}/modules/grpc.so $EXT_DIR/grpc.so \ + && ln -s /usr/lib/php${PHP_VERSION}/modules/protobuf.so $EXT_DIR/protobuf.so \ + && ln -s /usr/lib/php${PHP_VERSION}/modules/opentelemetry.so $EXT_DIR/opentelemetry.so + +## Blackfire +ENV BLACKFIRE_AGENT_SOCKET='' +RUN architecture=$(case ${TARGETPLATFORM} in "linux/amd64") echo "amd64" ;; linux/arm64) echo "arm64" ;; *) echo "amd64" ;; esac) \ + && curl -A "Docker" -o /tmp/blackfire.so -D - -L -s https://packages.blackfire.io/binaries/blackfire-php/${BLACKFIRE_VERSION}/blackfire-php-alpine_${architecture}-php-${BLACKFIRE_PHP_VERSION}.so \ + && mv /tmp/blackfire.so $(php -r "echo ini_get ('extension_dir');")/blackfire.so + +# New Relic +ENV NEWRELIC_ENABLED=0 +ENV NEWRELIC_LICENSE='' +ENV NEWRELIC_APPNAME='Spryker' +ENV NEWRELIC_DISTRIBUTED_TRACING_ENABLED=0 +ENV NEWRELIC_TRANSACTION_TRACER_ENABLED=0 +ENV NEWRELIC_SPAN_EVENTS_ENABLED=0 +ENV NEWRELIC_TRANSACTION_TRACER_THRESHOLD=0 +ENV NEWRELIC_DISTRIBUTED_TRACING_EXCLUDE_NEWRELIC_HEADER=0 + +RUN bash -c 'curl -L "https://download.newrelic.com/php_agent/archive/${NEWRELIC_VERSION}/newrelic-php5-${NEWRELIC_VERSION}-linux-musl.tar.gz" | tar -C /tmp -zx \ + && export NR_INSTALL_USE_CP_NOT_LN=1 \ + && export NR_INSTALL_SILENT=1 \ + && /tmp/newrelic-php5-*/newrelic-install install \ + && rm -rf /tmp/newrelic-php5-* /tmp/nrinstall* \ + && /usr/bin/install -d -m 777 /var/log/newrelic/ \ + && rm /usr/local/etc/php/conf.d/newrelic.ini' + +# Tideways +ENV TIDEWAYS_APIKEY='' +ENV TIDEWAYS_DAEMON_URI='' +ENV TIDEWAYS_CLI_ENABLED=0 +RUN bash -c 'if [ "${TARGETPLATFORM}" == "linux/amd64" ]; then \ + wget "https://s3-eu-west-1.amazonaws.com/tideways/extension/${TIDEWAYS_VERSION}/tideways-php-${TIDEWAYS_VERSION}-alpine-x86_64.tar.gz" \ + && tar xvzf tideways-php-${TIDEWAYS_VERSION}-alpine-x86_64.tar.gz \ + && cp ./tideways-php-${TIDEWAYS_VERSION}/tideways-php-alpine-${TIDEWAYS_PHP_VERSION}.so $(php-config --extension-dir)/tideways.so; fi' + +RUN bash -c 'if [ "${TARGETPLATFORM}" == "linux/arm64" ]; then \ + wget "https://s3-eu-west-1.amazonaws.com/tideways/extension/${TIDEWAYS_VERSION}/tideways-php-${TIDEWAYS_VERSION}-alpine-arm64.tar.gz" \ + && tar xvzf tideways-php-${TIDEWAYS_VERSION}-alpine-arm64.tar.gz \ + && cp ./tideways-php-${TIDEWAYS_VERSION}/tideways-php-alpine-${TIDEWAYS_PHP_VERSION}.so $(php-config --extension-dir)/tideways.so; fi' + +# GraphViz 7.0.5 +RUN cd /tmp && \ + curl -L https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/7.0.5/graphviz-7.0.5.tar.gz | tar -zx && \ + cd /tmp/graphviz-7.0.5 && \ + ./configure && \ + make && \ + make install && \ + rm -rf /tmp/graphviz-7.0.5 && \ + apk del --no-cache .graphviz-build-deps + +# Opcache +RUN /usr/bin/install -d -m 777 /var/run/opcache + +# Remove default FPM pool +RUN rm /usr/local/etc/php-fpm.d/www.conf && \ + rm /usr/local/etc/php-fpm.d/docker.conf && \ + rm /usr/local/etc/php-fpm.d/zz-docker.conf + +# Add FPM configs +COPY context/php/php-fpm.d/worker.conf /usr/local/etc/php-fpm.d/worker.conf +COPY context/php/php-fpm.conf /usr/local/etc/php-fpm.conf + +# Copy php.ini configuration +COPY context/php/php.ini /usr/local/etc/php/ +COPY context/php/conf.d/90-opcache.ini /usr/local/etc/php/conf.d/ +COPY context/php/conf.d/92-session.ini /usr/local/etc/php/conf.d/ +COPY context/php/disabled /usr/local/etc/php/disabled + +# Re-add "DigiCert Global Root CA" removed from the Mozilla/Alpine bundle in +# ca-certificates 20260611-r0. Still required to verify the STARTTLS chain of +# Microsoft Exchange Online (*.mail.protection.outlook.com), whose intermediate +# "DigiCert SHA2 Secure Server CA" chains up to that root. +COPY context/certs/ /usr/local/share/ca-certificates/ +RUN update-ca-certificates + +WORKDIR /data + +# Install composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer --version=${COMPOSER_VERSION} + +# Create application user 'spryker' +RUN addgroup spryker && \ + adduser -h /home/spryker -s /bin/sh -G www-data -D spryker && \ + chown spryker:spryker ${srcRoot} + +USER spryker +ENV COMPOSER_MEMORY_LIMIT=-1 +RUN mkdir -p /home/spryker/.composer +RUN bash -c '[[ $COMPOSER_VERSION == "1"* ]] && composer global require hirak/prestissimo && rm -rf /home/spryker/.composer/cache || true' + +USER root diff --git a/alpine/3.24/8.5/Dockerfile b/alpine/3.24/8.5/Dockerfile new file mode 100644 index 00000000..6eaed2eb --- /dev/null +++ b/alpine/3.24/8.5/Dockerfile @@ -0,0 +1,243 @@ +# syntax = docker/dockerfile:1.0.2-experimental +ARG SPRYKER_PHP_VERSION=8.5.9 +FROM php:${SPRYKER_PHP_VERSION}-fpm-alpine3.24 + +ARG TARGETPLATFORM +ARG COMPOSER_VERSION=2.10.2 +ARG BLACKFIRE_VERSION=1.92.53 +ARG BLACKFIRE_PHP_VERSION=85 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 +ARG TIDEWAYS_PHP_VERSION=8.5 + +ENV srcRoot /data +RUN mkdir -p ${srcRoot} + +ARG PHP_RUN_DEPS="\ + freetype \ + gmp \ + gnu-libiconv \ + icu-libs \ + libavif \ + libbz2 \ + libc6-compat \ + libjpeg-turbo \ + libpng \ + libwebp \ + libxml2 \ + libxpm \ + libxslt \ + libzip \ + rabbitmq-c \ + imagemagick" + +ARG PHP_BUILD_DEPS="\ + autoconf \ + bzip2-dev \ + freetype-dev \ + gmp-dev \ + icu-dev \ + icu-data-full \ + libavif-dev \ + libjpeg-turbo-dev \ + libpng-dev \ + libwebp-dev \ + libxml2-dev \ + libxpm-dev \ + libxslt-dev \ + libzip-dev \ + postgresql-dev \ + rabbitmq-c-dev \ + g++ \ + imagemagick-dev" + +# opcache is statically linked into the PHP 8.5 binary and can no longer be built +# as a shared module, so it is not listed here; 90-opcache.ini configures the built-in one. +ARG PHP_EXTENSIONS="\ + bcmath \ + bz2 \ + ftp \ + gd \ + gmp \ + intl \ + mysqli \ + pcntl \ + pdo_mysql \ + pdo_pgsql \ + pgsql \ + soap \ + sockets \ + xsl \ + zip" + +ARG PHP_PECL_EXTENSIONS="\ + apcu \ + redis" + +ARG ADDITIONAL_PHP_PECL_EXTENSIONS="\ + pcov \ + xdebug \ + xhprof \ + excimer \ + amqp \ + imagick" + +ARG GRAPHVIZ_BUILD_DEPS="\ + expat-dev" + +ARG CFLAGS="-I/usr/src/php" +RUN apk update \ + && apk upgrade \ + && apk add --no-cache \ + bash \ + coreutils \ + curl \ + g++ \ + git \ + make \ + mysql-client \ + netcat-openbsd \ + openssh \ + postgresql-client \ + procps \ + python3 \ + shadow \ + unzip \ + linux-headers \ + libstdc++ \ + openssl-dev \ + zlib-dev \ + scdoc \ + ${PHP_RUN_DEPS} \ + && apk add --no-cache --virtual .php-build-deps ${PHP_BUILD_DEPS} \ + && apk add --no-cache --virtual .graphviz-build-deps ${GRAPHVIZ_BUILD_DEPS} \ + && rm -rf /var/lib/apt/lists/ \ + && cd /tmp \ + && git clone --depth 1 --branch v3.0.0_rc7 https://github.com/alpinelinux/apk-tools.git apk-tools-v3.0.0_rc7 \ + && cd apk-tools-v3.0.0_rc7 && make LUA=no && make LUA=no install \ + && cd /tmp \ + && curl -LO https://github.com/unicode-org/icu/releases/download/release-74-1/icu4c-74_1-src.tgz \ + && tar xzf icu4c-74_1-src.tgz \ + && cd icu/source && ./configure --prefix=/usr && make && make install \ + && cd /tmp \ + && rm -rf /tmp/apk-tools-v3.0.0_rc7 /tmp/icu4c-74_1-src.tgz /tmp/icu \ + && docker-php-ext-configure gd \ + --disable-gd-jis-conv \ + --with-avif=/usr \ + --with-freetype=/usr \ + --with-jpeg=/usr \ + --with-webp=/usr \ + --with-xpm=/usr \ + && docker-php-ext-install -j5 ${PHP_EXTENSIONS} \ + && pecl install -o -f ${PHP_PECL_EXTENSIONS} ${ADDITIONAL_PHP_PECL_EXTENSIONS} \ + && rm -rf /tmp/pear \ + && docker-php-ext-enable ${PHP_EXTENSIONS} ${PHP_PECL_EXTENSIONS} \ + && apk del --no-cache .php-build-deps \ + && rm -rf /tmp/icu* + +# Related to https://github.com/docker-library/php/issues/240 +ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so + +# Otel +RUN echo "https://dl-cdn.alpinelinux.org/alpine/v$(cut -d'.' -f1,2 /etc/alpine-release)/community" >> /etc/apk/repositories +RUN PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;") \ + && apk add --no-cache \ + php${PHP_VERSION}-pecl-grpc \ + php${PHP_VERSION}-pecl-protobuf \ + php${PHP_VERSION}-pecl-opentelemetry + +RUN PHP_VERSION=$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;") \ + && EXT_DIR=$(php -r "echo ini_get('extension_dir');") \ + && ln -s /usr/lib/php${PHP_VERSION}/modules/grpc.so $EXT_DIR/grpc.so \ + && ln -s /usr/lib/php${PHP_VERSION}/modules/protobuf.so $EXT_DIR/protobuf.so \ + && ln -s /usr/lib/php${PHP_VERSION}/modules/opentelemetry.so $EXT_DIR/opentelemetry.so + +## Blackfire +ENV BLACKFIRE_AGENT_SOCKET='' +RUN architecture=$(case ${TARGETPLATFORM} in "linux/amd64") echo "amd64" ;; linux/arm64) echo "arm64" ;; *) echo "amd64" ;; esac) \ + && curl -A "Docker" -o /tmp/blackfire.so -D - -L -s https://packages.blackfire.io/binaries/blackfire-php/${BLACKFIRE_VERSION}/blackfire-php-alpine_${architecture}-php-${BLACKFIRE_PHP_VERSION}.so \ + && mv /tmp/blackfire.so $(php -r "echo ini_get ('extension_dir');")/blackfire.so + +# New Relic +ENV NEWRELIC_ENABLED=0 +ENV NEWRELIC_LICENSE='' +ENV NEWRELIC_APPNAME='Spryker' +ENV NEWRELIC_DISTRIBUTED_TRACING_ENABLED=0 +ENV NEWRELIC_TRANSACTION_TRACER_ENABLED=0 +ENV NEWRELIC_SPAN_EVENTS_ENABLED=0 +ENV NEWRELIC_TRANSACTION_TRACER_THRESHOLD=0 +ENV NEWRELIC_DISTRIBUTED_TRACING_EXCLUDE_NEWRELIC_HEADER=0 + +RUN bash -c 'curl -L "https://download.newrelic.com/php_agent/archive/${NEWRELIC_VERSION}/newrelic-php5-${NEWRELIC_VERSION}-linux-musl.tar.gz" | tar -C /tmp -zx \ + && export NR_INSTALL_USE_CP_NOT_LN=1 \ + && export NR_INSTALL_SILENT=1 \ + && /tmp/newrelic-php5-*/newrelic-install install \ + && rm -rf /tmp/newrelic-php5-* /tmp/nrinstall* \ + && /usr/bin/install -d -m 777 /var/log/newrelic/ \ + && rm /usr/local/etc/php/conf.d/newrelic.ini' + +# Tideways +ENV TIDEWAYS_APIKEY='' +ENV TIDEWAYS_DAEMON_URI='' +ENV TIDEWAYS_CLI_ENABLED=0 +RUN bash -c 'if [ "${TARGETPLATFORM}" == "linux/amd64" ]; then \ + wget "https://s3-eu-west-1.amazonaws.com/tideways/extension/${TIDEWAYS_VERSION}/tideways-php-${TIDEWAYS_VERSION}-alpine-x86_64.tar.gz" \ + && tar xvzf tideways-php-${TIDEWAYS_VERSION}-alpine-x86_64.tar.gz \ + && cp ./tideways-php-${TIDEWAYS_VERSION}/tideways-php-alpine-${TIDEWAYS_PHP_VERSION}.so $(php-config --extension-dir)/tideways.so; fi' + +RUN bash -c 'if [ "${TARGETPLATFORM}" == "linux/arm64" ]; then \ + wget "https://s3-eu-west-1.amazonaws.com/tideways/extension/${TIDEWAYS_VERSION}/tideways-php-${TIDEWAYS_VERSION}-alpine-arm64.tar.gz" \ + && tar xvzf tideways-php-${TIDEWAYS_VERSION}-alpine-arm64.tar.gz \ + && cp ./tideways-php-${TIDEWAYS_VERSION}/tideways-php-alpine-${TIDEWAYS_PHP_VERSION}.so $(php-config --extension-dir)/tideways.so; fi' + +# GraphViz 7.0.5 +RUN cd /tmp && \ + curl -L https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/7.0.5/graphviz-7.0.5.tar.gz | tar -zx && \ + cd /tmp/graphviz-7.0.5 && \ + ./configure && \ + make && \ + make install && \ + rm -rf /tmp/graphviz-7.0.5 && \ + apk del --no-cache .graphviz-build-deps + +# Opcache +RUN /usr/bin/install -d -m 777 /var/run/opcache + +# Remove default FPM pool +RUN rm /usr/local/etc/php-fpm.d/www.conf && \ + rm /usr/local/etc/php-fpm.d/docker.conf && \ + rm /usr/local/etc/php-fpm.d/zz-docker.conf + +# Add FPM configs +COPY context/php/php-fpm.d/worker.conf /usr/local/etc/php-fpm.d/worker.conf +COPY context/php/php-fpm.conf /usr/local/etc/php-fpm.conf + +# Copy php.ini configuration +COPY context/php/php.ini /usr/local/etc/php/ +COPY context/php/conf.d/90-opcache.ini /usr/local/etc/php/conf.d/ +COPY context/php/conf.d/92-session.ini /usr/local/etc/php/conf.d/ +COPY context/php/disabled /usr/local/etc/php/disabled + +# Re-add "DigiCert Global Root CA" removed from the Mozilla/Alpine bundle in +# ca-certificates 20260611-r0. Still required to verify the STARTTLS chain of +# Microsoft Exchange Online (*.mail.protection.outlook.com), whose intermediate +# "DigiCert SHA2 Secure Server CA" chains up to that root. +COPY context/certs/ /usr/local/share/ca-certificates/ +RUN update-ca-certificates + +WORKDIR /data + +# Install composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer --version=${COMPOSER_VERSION} + +# Create application user 'spryker' +RUN addgroup spryker && \ + adduser -h /home/spryker -s /bin/sh -G www-data -D spryker && \ + chown spryker:spryker ${srcRoot} + +USER spryker +ENV COMPOSER_MEMORY_LIMIT=-1 +RUN mkdir -p /home/spryker/.composer +RUN bash -c '[[ $COMPOSER_VERSION == "1"* ]] && composer global require hirak/prestissimo && rm -rf /home/spryker/.composer/cache || true' + +USER root diff --git a/context/php/disabled/newrelic.ini b/context/php/disabled/newrelic.ini index 0a98bb20..e3ab0ec8 100644 --- a/context/php/disabled/newrelic.ini +++ b/context/php/disabled/newrelic.ini @@ -31,3 +31,9 @@ newrelic.browser_monitoring.debug = ${NEWRELIC_BROWSER_MONITORING_DEBUG} ;Errors inbox newrelic.error_collector.ignore_exceptions = ${NEWRELIC_ERROR_COLLECTOR_IGNORE_EXCEPTIONS} + +;Application logging (logs in context) +newrelic.application_logging.enabled = ${NEWRELIC_APPLICATION_LOGGING_ENABLED} +newrelic.application_logging.metrics.enabled = ${NEWRELIC_APPLICATION_LOGGING_METRICS_ENABLED} +newrelic.application_logging.forwarding.enabled = ${NEWRELIC_APPLICATION_LOGGING_FORWARDING_ENABLED} +newrelic.application_logging.forwarding.log_level = ${NEWRELIC_APPLICATION_LOGGING_FORWARDING_LOG_LEVEL} diff --git a/debian/bookworm/8.5/Dockerfile b/debian/bookworm/8.5/Dockerfile new file mode 100644 index 00000000..320ef08b --- /dev/null +++ b/debian/bookworm/8.5/Dockerfile @@ -0,0 +1,217 @@ +# syntax=docker/dockerfile:1.7 +ARG SPRYKER_PHP_VERSION=8.5.9 + +# PHP 8.5 is not published for "bullseye" upstream, so this image is based on "bookworm". +FROM php:${SPRYKER_PHP_VERSION}-fpm-bookworm + +SHELL ["/bin/bash", "-o", "pipefail", "-c"] +ARG TARGETPLATFORM +ARG COMPOSER_VERSION=2.10.2 +ARG BLACKFIRE_VERSION=1.92.53 +ARG BLACKFIRE_PHP_VERSION=85 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 +ARG TIDEWAYS_PHP_VERSION=8.5 +ARG GOLANG_VERSION=1.20.3 + +ENV srcRoot /data + +RUN mkdir -p ${srcRoot} + +ARG PHP_RUN_DEPS="\ + libavif15 \ + libbz2-1.0 \ + libfreetype6 \ + libgmp10 \ + libicu72 \ + libjpeg62-turbo \ + libpng16-16 \ + libwebp7 \ + libxml2 \ + libxpm4 \ + libxslt1.1 \ + libzip4 \ + libmagickwand-6.q16-6 \ + libmagickcore-6.q16-6" + +ARG PHP_BUILD_DEPS="\ + libavif-dev \ + libbz2-dev \ + libfreetype6-dev \ + libgmp-dev \ + libicu-dev \ + libjpeg62-turbo-dev \ + libpng-dev \ + libpq-dev \ + libwebp-dev \ + libxml2-dev \ + libxpm-dev \ + libxslt1-dev \ + libzip-dev \ + libssl-dev \ + librabbitmq-dev \ + libgrpc-dev \ + libprotobuf-dev \ + protobuf-compiler \ + libmagickwand-dev" + +# opcache is statically linked into the PHP 8.5 binary and can no longer be built +# as a shared module, so it is not listed here; 90-opcache.ini configures the built-in one. +ARG PHP_EXTENSIONS="\ + bcmath \ + bz2 \ + ftp \ + gd \ + gmp \ + intl \ + mysqli \ + pcntl \ + pdo_mysql \ + pdo_pgsql \ + pgsql \ + soap \ + sockets \ + xsl \ + zip" + +ARG PHP_PECL_EXTENSIONS="\ + apcu \ + redis" + +ARG ADDITIONAL_PHP_PECL_EXTENSIONS="\ + pcov \ + xdebug \ + xhprof \ + excimer \ + amqp \ + grpc \ + protobuf \ + opentelemetry \ + imagick" + +ARG CFLAGS="-I/usr/src/php" +RUN apt update -y \ + && apt upgrade -y \ + && apt install -y \ + bash \ + curl \ + default-mysql-client \ + g++ \ + git \ + gnupg2 \ + graphviz \ + locales-all \ + make \ + netcat-openbsd \ + openssh-client \ + postgresql-client \ + procps \ + python3 \ + unzip \ + wget \ + build-essential \ + automake \ + libtool \ + libpcre3 \ + libpcre3-dev \ + autoconf \ + ${PHP_RUN_DEPS} \ + && \ + apt install -y ${PHP_BUILD_DEPS} \ + && rm -rf /var/lib/apt/lists/ \ + && \ + docker-php-ext-configure gd \ + --disable-gd-jis-conv \ + --with-avif=/usr \ + --with-freetype=/usr \ + --with-jpeg=/usr \ + --with-webp=/usr \ + --with-xpm=/usr \ + && docker-php-ext-install -j5 ${PHP_EXTENSIONS} \ + && \ + set -eux; export MAKEFLAGS="-j$(nproc)"; pecl install -o -f ${PHP_PECL_EXTENSIONS} ${ADDITIONAL_PHP_PECL_EXTENSIONS} \ + && rm -rf /tmp/pear \ + && docker-php-ext-enable ${PHP_EXTENSIONS} ${PHP_PECL_EXTENSIONS} \ + && apt remove -y $PHP_BUILD_DEPS \ + && apt clean + +# Golang +RUN architecture=$(case ${TARGETPLATFORM} in "linux/amd64") echo "amd64" ;; linux/arm64) echo "arm64" ;; *) echo "amd64" ;; esac) \ + && curl -L "https://go.dev/dl/go${GOLANG_VERSION}.linux-${architecture}.tar.gz" | tar -C /usr/local -xz +ENV PATH="$PATH:/usr/local/go/bin" + +RUN echo "dash dash/sh boolean false" | debconf-set-selections +RUN DEBIAN_FRONTEND=noninteractive dpkg-reconfigure dash + +# Blackfire +ENV BLACKFIRE_AGENT_SOCKET='' +RUN architecture=$(case ${TARGETPLATFORM} in "linux/amd64") echo "amd64" ;; linux/arm64) echo "arm64" ;; *) echo "amd64" ;; esac) \ + && curl -A "Docker" -o /tmp/blackfire.so -D - -L -s https://packages.blackfire.io/binaries/blackfire-php/${BLACKFIRE_VERSION}/blackfire-php-linux_${architecture}-php-${BLACKFIRE_PHP_VERSION}.so \ + && mv /tmp/blackfire.so $(php -r "echo ini_get ('extension_dir');")/blackfire.so + +# New Relic +ENV NEWRELIC_ENABLED=0 +ENV NEWRELIC_LICENSE='' +ENV NEWRELIC_APPNAME='Spryker' +ENV NEWRELIC_DISTRIBUTED_TRACING_ENABLED=0 +ENV NEWRELIC_TRANSACTION_TRACER_ENABLED=0 +ENV NEWRELIC_SPAN_EVENTS_ENABLED=0 +ENV NEWRELIC_TRANSACTION_TRACER_THRESHOLD=0 +ENV NEWRELIC_DISTRIBUTED_TRACING_EXCLUDE_NEWRELIC_HEADER=0 + +RUN bash -c 'curl -L "https://download.newrelic.com/php_agent/archive/${NEWRELIC_VERSION}/newrelic-php5-${NEWRELIC_VERSION}-linux.tar.gz" | tar -C /tmp -zx \ + && export NR_INSTALL_USE_CP_NOT_LN=1 \ + && export NR_INSTALL_SILENT=1 \ + && /tmp/newrelic-php5-*/newrelic-install install \ + && rm -rf /tmp/newrelic-php5-* /tmp/nrinstall* \ + && /usr/bin/install -d -m 777 /var/log/newrelic/ \ + && rm /usr/local/etc/php/conf.d/newrelic.ini \ + && ln -s /lib64/ld-linux-x86-64.so.2 /lib/ld-linux-x86-64.so.2' + +# Tideways +RUN bash -c 'if [ "${TARGETPLATFORM}" == "linux/amd64" ]; then \ + wget "https://s3-eu-west-1.amazonaws.com/tideways/extension/${TIDEWAYS_VERSION}/tideways-php-${TIDEWAYS_VERSION}-x86_64.tar.gz" && \ + tar xvzf tideways-php-${TIDEWAYS_VERSION}-x86_64.tar.gz && \ + cp ./tideways-php-${TIDEWAYS_VERSION}/tideways-php-${TIDEWAYS_PHP_VERSION}.so $(php-config --extension-dir)/tideways.so; fi' + +RUN bash -c 'if [ "${TARGETPLATFORM}" == "linux/arm64" ]; then \ + wget "https://s3-eu-west-1.amazonaws.com/tideways/extension/${TIDEWAYS_VERSION}/tideways-php-${TIDEWAYS_VERSION}-arm64.tar.gz" && \ + tar xvzf tideways-php-${TIDEWAYS_VERSION}-arm64.tar.gz && \ + cp ./tideways-php-${TIDEWAYS_VERSION}/tideways-php-${TIDEWAYS_PHP_VERSION}.so $(php-config --extension-dir)/tideways.so; fi' + +# Opcache +RUN /usr/bin/install -d -m 777 /var/run/opcache + +# Remove default FPM pool +RUN rm /usr/local/etc/php-fpm.d/www.conf && \ + rm /usr/local/etc/php-fpm.d/docker.conf && \ + rm /usr/local/etc/php-fpm.d/zz-docker.conf + +# Add FPM configs +COPY context/php/php-fpm.d/worker.conf /usr/local/etc/php-fpm.d/worker.conf +COPY context/php/php-fpm.conf /usr/local/etc/php-fpm.conf + +# Copy php.ini configuration +COPY context/php/php.ini /usr/local/etc/php/ +COPY context/php/conf.d/90-opcache.ini /usr/local/etc/php/conf.d/ +COPY context/php/conf.d/92-session.ini /usr/local/etc/php/conf.d/ +COPY context/php/disabled /usr/local/etc/php/disabled + +# Install composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer --version=${COMPOSER_VERSION} + +# Create application user 'spryker' +RUN addgroup spryker && \ + useradd --home /home/spryker --shell /bin/sh --groups www-data --gid spryker spryker && \ + mkdir -p /home/spryker && \ + chown spryker:spryker /home/spryker && \ + chown spryker:spryker ${srcRoot} + +WORKDIR /data + +USER spryker +ENV COMPOSER_MEMORY_LIMIT=-1 +RUN mkdir -p /home/spryker/.composer +RUN bash -c '[[ $COMPOSER_VERSION == "1"* ]] && composer global require hirak/prestissimo && rm -rf /home/spryker/.composer/cache || true' + +USER root diff --git a/debian/bullseye/8.2/Dockerfile b/debian/bullseye/8.2/Dockerfile index 08b9139d..43cdc455 100644 --- a/debian/bullseye/8.2/Dockerfile +++ b/debian/bullseye/8.2/Dockerfile @@ -5,11 +5,11 @@ FROM php:${SPRYKER_PHP_VERSION}-fpm-bullseye SHELL ["/bin/bash", "-o", "pipefail", "-c"] ARG TARGETPLATFORM -ARG COMPOSER_VERSION=2.9.8 +ARG COMPOSER_VERSION=2.10.2 ARG BLACKFIRE_VERSION=1.87.1 ARG BLACKFIRE_PHP_VERSION=82 -ARG NEWRELIC_VERSION=12.8.0.37 -ARG TIDEWAYS_VERSION=5.32.0 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 ARG TIDEWAYS_PHP_VERSION=8.2 ARG GOLANG_VERSION=1.20.3 diff --git a/debian/bullseye/8.3/Dockerfile b/debian/bullseye/8.3/Dockerfile index d082b982..9af90562 100644 --- a/debian/bullseye/8.3/Dockerfile +++ b/debian/bullseye/8.3/Dockerfile @@ -5,11 +5,11 @@ FROM php:${SPRYKER_PHP_VERSION}-fpm-bullseye SHELL ["/bin/bash", "-o", "pipefail", "-c"] ARG TARGETPLATFORM -ARG COMPOSER_VERSION=2.9.8 +ARG COMPOSER_VERSION=2.10.2 ARG BLACKFIRE_VERSION=1.92.48 ARG BLACKFIRE_PHP_VERSION=83 -ARG NEWRELIC_VERSION=12.8.0.37 -ARG TIDEWAYS_VERSION=5.32.0 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 ARG TIDEWAYS_PHP_VERSION=8.3 ARG GOLANG_VERSION=1.20.3 diff --git a/debian/bullseye/8.4/Dockerfile b/debian/bullseye/8.4/Dockerfile index 5d246832..a49367cb 100644 --- a/debian/bullseye/8.4/Dockerfile +++ b/debian/bullseye/8.4/Dockerfile @@ -5,11 +5,11 @@ FROM php:${SPRYKER_PHP_VERSION}-fpm-bullseye SHELL ["/bin/bash", "-o", "pipefail", "-c"] ARG TARGETPLATFORM -ARG COMPOSER_VERSION=2.9.8 +ARG COMPOSER_VERSION=2.10.2 ARG BLACKFIRE_VERSION=1.92.48 ARG BLACKFIRE_PHP_VERSION=84 -ARG NEWRELIC_VERSION=12.8.0.37 -ARG TIDEWAYS_VERSION=5.32.0 +ARG NEWRELIC_VERSION=12.9.0.38 +ARG TIDEWAYS_VERSION=5.42.0 ARG TIDEWAYS_PHP_VERSION=8.4 ARG GOLANG_VERSION=1.20.3 diff --git a/images.json b/images.json new file mode 100644 index 00000000..82df9101 --- /dev/null +++ b/images.json @@ -0,0 +1,37 @@ +[ + { + "id": "alpine/3.23/8.4", + "dockerfile": "alpine/3.23/8.4/Dockerfile", + "context": ".", + "platforms": ["linux/amd64", "linux/arm64"], + "tags": ["loeffelhardt/php:8.4-alpine3.23"] + }, + { + "id": "alpine/3.24/8.4", + "dockerfile": "alpine/3.24/8.4/Dockerfile", + "context": ".", + "platforms": ["linux/amd64", "linux/arm64"], + "tags": ["loeffelhardt/php:8.4-alpine3.24", "loeffelhardt/php:8.4"] + }, + { + "id": "alpine/3.24/8.5", + "dockerfile": "alpine/3.24/8.5/Dockerfile", + "context": ".", + "platforms": ["linux/amd64", "linux/arm64"], + "tags": ["loeffelhardt/php:8.5-alpine3.24", "loeffelhardt/php:latest", "loeffelhardt/php:8.5"] + }, + { + "id": "debian/bullseye/8.4", + "dockerfile": "debian/bullseye/8.4/Dockerfile", + "context": ".", + "platforms": ["linux/amd64", "linux/arm64"], + "tags": ["loeffelhardt/php:8.4-debian"] + }, + { + "id": "debian/bookworm/8.5", + "dockerfile": "debian/bookworm/8.5/Dockerfile", + "context": ".", + "platforms": ["linux/amd64", "linux/arm64"], + "tags": ["loeffelhardt/php:8.5-debian"] + } +] diff --git a/scripts/build-images.sh b/scripts/build-images.sh new file mode 100755 index 00000000..a82d1ec9 --- /dev/null +++ b/scripts/build-images.sh @@ -0,0 +1,163 @@ +#!/usr/bin/env bash +# +# Build and push loeffelhardt/php Docker images locally, faster than the +# GitHub Actions runner (which relies on slow QEMU emulation). +# +# Matrix of images/tags/platforms lives in images.json (single source of +# truth, kept in sync with .github/workflows/build.yml). +# +# Usage: +# scripts/build-images.sh build [IMAGE_ID] # build & warm local cache, no push +# scripts/build-images.sh push [IMAGE_ID] # (re)build from cache & push +# scripts/build-images.sh login # prompt for Docker Hub credentials +# scripts/build-images.sh list # list available IMAGE_IDs +# scripts/build-images.sh clean # remove builder & local cache +# +# IMAGE_ID is matched as a substring against the "id" field in images.json +# (e.g. "alpine/3.24/8.5", "alpine", "debian"). Omit to target all images. + +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +IMAGES_FILE="${ROOT_DIR}/images.json" +CACHE_DIR="${ROOT_DIR}/.buildx-cache" +BUILDER_NAME="el-docker-php-builder" + +log() { printf '\033[1;34m==>\033[0m %s\n' "$*"; } +warn() { printf '\033[1;33m!!\033[0m %s\n' "$*" >&2; } +die() { printf '\033[1;31mERROR:\033[0m %s\n' "$*" >&2; exit 1; } + +require_bin() { + command -v "$1" >/dev/null 2>&1 || die "'$1' is required but not installed." +} + +ensure_builder() { + if ! docker buildx inspect "${BUILDER_NAME}" >/dev/null 2>&1; then + log "Creating buildx builder '${BUILDER_NAME}'" + docker buildx create --name "${BUILDER_NAME}" --driver docker-container --bootstrap + fi + docker buildx use "${BUILDER_NAME}" +} + +docker_login() { + if [[ -n "${DOCKER_USERNAME:-}" && -n "${DOCKER_PASSWORD:-}" ]]; then + log "Logging in to Docker Hub as ${DOCKER_USERNAME} (from env)" + printf '%s' "${DOCKER_PASSWORD}" | docker login --username "${DOCKER_USERNAME}" --password-stdin + return + fi + + read -r -p "Docker Hub username (loeffelhardt-bot): " docker_user + read -r -s -p "Docker Hub password/token: " docker_pass + echo + [[ -n "${docker_user}" ]] || die "Username cannot be empty." + [[ -n "${docker_pass}" ]] || die "Password/token cannot be empty." + printf '%s' "${docker_pass}" | docker login --username "${docker_user}" --password-stdin +} + +# Print matrix entries matching optional filter, one JSON object per line. +matrix_entries() { + local filter="${1:-}" + if [[ -z "${filter}" ]]; then + jq -c '.[]' "${IMAGES_FILE}" + else + jq -c --arg f "${filter}" '.[] | select(.id | contains($f))' "${IMAGES_FILE}" + fi +} + +cache_path_for() { + local id="$1" + echo "${CACHE_DIR}/$(echo "${id}" | tr '/' '-')" +} + +# Run buildx for a single matrix entry. +# mode: "build" (cache only, no push) or "push" (build from cache + push) +run_entry() { + local entry="$1" mode="$2" + local id dockerfile context platforms cache_dir + id="$(jq -r '.id' <<<"${entry}")" + dockerfile="$(jq -r '.dockerfile' <<<"${entry}")" + context="$(jq -r '.context' <<<"${entry}")" + platforms="$(jq -r '.platforms | join(",")' <<<"${entry}")" + cache_dir="$(cache_path_for "${id}")" + mkdir -p "${cache_dir}" + + local -a tag_args=() + while IFS= read -r tag; do + tag_args+=(--tag "${tag}") + done < <(jq -r '.tags[]' <<<"${entry}") + + local -a output_args=() + if [[ "${mode}" == "push" ]]; then + output_args=(--push) + else + output_args=(--output type=cacheonly) + fi + + log "[${mode}] ${id} (platforms: ${platforms})" + ( + cd "${ROOT_DIR}" + docker buildx build \ + --platform "${platforms}" \ + --file "${dockerfile}" \ + "${tag_args[@]}" \ + --cache-from "type=local,src=${cache_dir}" \ + --cache-to "type=local,dest=${cache_dir},mode=max" \ + "${output_args[@]}" \ + "${context}" + ) +} + +cmd_build() { run_matrix "build" "${1:-}"; } +cmd_push() { run_matrix "push" "${1:-}"; } + +run_matrix() { + local mode="$1" filter="${2:-}" + local entries + entries="$(matrix_entries "${filter}")" + [[ -n "${entries}" ]] || die "No image matches filter '${filter}' in images.json" + + ensure_builder + + while IFS= read -r entry; do + run_entry "${entry}" "${mode}" + done <<<"${entries}" + + log "Done (${mode})." +} + +cmd_list() { + jq -r '.[] | "\(.id)\t\(.tags | join(", "))"' "${IMAGES_FILE}" | column -t -s $'\t' +} + +cmd_clean() { + log "Removing local buildx cache (${CACHE_DIR})" + rm -rf "${CACHE_DIR}" + if docker buildx inspect "${BUILDER_NAME}" >/dev/null 2>&1; then + log "Removing buildx builder '${BUILDER_NAME}'" + docker buildx rm "${BUILDER_NAME}" + fi +} + +usage() { + sed -n '2,20p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//' +} + +main() { + require_bin docker + require_bin jq + docker buildx version >/dev/null 2>&1 || die "docker buildx plugin is required." + + local cmd="${1:-}" + [[ $# -gt 0 ]] && shift || true + + case "${cmd}" in + build) cmd_build "${1:-}" ;; + push) cmd_push "${1:-}" ;; + login) docker_login ;; + list) cmd_list ;; + clean) cmd_clean ;; + *) usage; exit 1 ;; + esac +} + +main "$@"