From a70e92de38bf898ebfd6f0621f9655a82804d38f Mon Sep 17 00:00:00 2001 From: Daniel Polito Date: Tue, 13 Oct 2026 14:41:32 -0300 Subject: [PATCH] chore: simplify image CI and sunset PHP 8.1 --- .github/dependabot.yml | 13 +- .github/workflows/ci-cd.yml | 619 +++++------------------ .github/workflows/docker-description.yml | 11 +- 8.1-nginx-prod/Dockerfile | 60 --- 8.1-nginx-prod/default.tmpl | 50 -- 8.1-nginx-prod/entrypoint | 25 - 8.1-nginx-prod/supervisor.conf | 27 - 8.1-nginx/Dockerfile | 60 --- 8.1-nginx/default.tmpl | 50 -- 8.1-nginx/entrypoint | 34 -- 8.1-nginx/supervisor.conf | 27 - 8.1-node/Dockerfile | 4 - 8.1-prod/Dockerfile | 80 --- 8.1-prod/entrypoint | 24 - 8.1-prod/kool.ini | 51 -- 8.1-prod/zz-docker.conf | 53 -- 8.1/Dockerfile | 82 --- 8.1/entrypoint | 33 -- 8.1/kool.ini | 29 -- 8.1/zz-docker.conf | 53 -- README.md | 39 +- fwd-template.json | 121 ----- kool.yml | 14 - scripts/test-image.sh | 59 +++ 24 files changed, 230 insertions(+), 1388 deletions(-) delete mode 100644 8.1-nginx-prod/Dockerfile delete mode 100644 8.1-nginx-prod/default.tmpl delete mode 100644 8.1-nginx-prod/entrypoint delete mode 100644 8.1-nginx-prod/supervisor.conf delete mode 100644 8.1-nginx/Dockerfile delete mode 100644 8.1-nginx/default.tmpl delete mode 100644 8.1-nginx/entrypoint delete mode 100644 8.1-nginx/supervisor.conf delete mode 100644 8.1-node/Dockerfile delete mode 100644 8.1-prod/Dockerfile delete mode 100644 8.1-prod/entrypoint delete mode 100644 8.1-prod/kool.ini delete mode 100644 8.1-prod/zz-docker.conf delete mode 100644 8.1/Dockerfile delete mode 100644 8.1/entrypoint delete mode 100644 8.1/kool.ini delete mode 100644 8.1/zz-docker.conf create mode 100644 scripts/test-image.sh diff --git a/.github/dependabot.yml b/.github/dependabot.yml index abee2af..39ad4b2 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,9 +4,16 @@ updates: - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "daily" + interval: "weekly" + groups: + github-actions: + patterns: ["*"] - package-ecosystem: "docker" - directory: "/" + directories: + - "/8.*" schedule: - interval: "daily" \ No newline at end of file + interval: "weekly" + groups: + php-images: + patterns: ["*"] diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 5a34073..389695e 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -2,574 +2,209 @@ name: CI/CD on: push: + branches: [master] + pull_request: workflow_dispatch: schedule: - cron: "0 0 * * 0" -jobs: - # =========================================== - # Alpine: Build and Test (all variants per version) - # =========================================== - build-test-alpine: - runs-on: ubuntu-latest +permissions: + contents: read - strategy: - matrix: - version: ["8.1", "8.2", "8.3", "8.4", "8.5"] +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + # Never interrupt a release between publishing base and derived images. + cancel-in-progress: ${{ github.event_name == 'pull_request' }} +jobs: + checks: + runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup QEMU - uses: docker/setup-qemu-action@v3 - - - name: Setup Docker Buildx (docker driver for local builds) - uses: docker/setup-buildx-action@v3 - with: - driver: docker - - # ======================================== - # BASE DEV IMAGE - # ======================================== - - name: Build base dev image - uses: docker/build-push-action@v6 - with: - context: ${{ matrix.version }} - load: true - tags: kooldev/php:${{ matrix.version }} - - - name: Tests (base dev) - Basic - run: | - docker run kooldev/php:${{ matrix.version }} php -v - docker run kooldev/php:${{ matrix.version }} composer -V - docker run kooldev/php:${{ matrix.version }} composer1 -V - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }} php -v - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }} composer -V - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }} composer1 -V - docker run kooldev/php:${{ matrix.version }} php -m | grep readline - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }} php -m - - - name: Tests (base dev) - Dockerize - run: | - docker run kooldev/php:${{ matrix.version }} dockerize --version - docker run kooldev/php:${{ matrix.version }} sh -c 'echo "{{ .Env.TEST_VAR }}" > /tmp/test.tmpl && TEST_VAR=hello dockerize -template /tmp/test.tmpl:/tmp/test.out && cat /tmp/test.out | grep hello' - - - name: Tests (base dev) - PHP Extensions - run: | - docker run kooldev/php:${{ matrix.version }} php -m | grep -i bcmath - docker run kooldev/php:${{ matrix.version }} php -m | grep -i gd - docker run kooldev/php:${{ matrix.version }} php -m | grep -i intl - docker run kooldev/php:${{ matrix.version }} php -m | grep -i pdo_mysql - docker run kooldev/php:${{ matrix.version }} php -m | grep -i pdo_pgsql - docker run kooldev/php:${{ matrix.version }} php -m | grep -i redis - docker run kooldev/php:${{ matrix.version }} php -m | grep -i zip - docker run kooldev/php:${{ matrix.version }} php -m | grep -i mbstring - docker run kooldev/php:${{ matrix.version }} php -m | grep -i ldap - - - name: Tests (base dev) - Development Checks - run: | - docker run kooldev/php:${{ matrix.version }} php -m | grep -i pcov - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }} php -m | grep -i xdebug - - # ======================================== - # BASE PROD IMAGE - # ======================================== - - name: Build base prod image - uses: docker/build-push-action@v6 - with: - context: ${{ matrix.version }}-prod - load: true - tags: kooldev/php:${{ matrix.version }}-prod - - - name: Tests (base prod) - Basic - run: | - docker run kooldev/php:${{ matrix.version }}-prod php -v - docker run kooldev/php:${{ matrix.version }}-prod composer -V - docker run kooldev/php:${{ matrix.version }}-prod composer1 -V - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-prod php -v - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-prod composer -V - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-prod composer1 -V - docker run kooldev/php:${{ matrix.version }}-prod php -m | grep readline - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }}-prod php -m - - - name: Tests (base prod) - Dockerize - run: | - docker run kooldev/php:${{ matrix.version }}-prod dockerize --version - docker run kooldev/php:${{ matrix.version }}-prod sh -c 'echo "{{ .Env.TEST_VAR }}" > /tmp/test.tmpl && TEST_VAR=hello dockerize -template /tmp/test.tmpl:/tmp/test.out && cat /tmp/test.out | grep hello' - - - name: Tests (base prod) - PHP Extensions - run: | - docker run kooldev/php:${{ matrix.version }}-prod php -m | grep -i bcmath - docker run kooldev/php:${{ matrix.version }}-prod php -m | grep -i gd - docker run kooldev/php:${{ matrix.version }}-prod php -m | grep -i intl - docker run kooldev/php:${{ matrix.version }}-prod php -m | grep -i pdo_mysql - docker run kooldev/php:${{ matrix.version }}-prod php -m | grep -i pdo_pgsql - docker run kooldev/php:${{ matrix.version }}-prod php -m | grep -i redis - docker run kooldev/php:${{ matrix.version }}-prod php -m | grep -i zip - docker run kooldev/php:${{ matrix.version }}-prod php -m | grep -i mbstring - docker run kooldev/php:${{ matrix.version }}-prod php -m | grep -i ldap - - - name: Tests (base prod) - Production Checks - run: | - docker run kooldev/php:${{ matrix.version }}-prod php -m | grep -i "Zend OPcache" - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }}-prod php -m | grep -i xdebug && exit 1 || echo "OK: xdebug not in prod" - - # ======================================== - # NGINX DEV IMAGE (uses local base dev) - # ======================================== - - name: Build nginx dev image - uses: docker/build-push-action@v6 - with: - context: ${{ matrix.version }}-nginx - load: true - tags: kooldev/php:${{ matrix.version }}-nginx - - - name: Tests (nginx dev) - Basic - run: | - docker run kooldev/php:${{ matrix.version }}-nginx php -v - docker run kooldev/php:${{ matrix.version }}-nginx composer -V - docker run kooldev/php:${{ matrix.version }}-nginx composer1 -V - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-nginx php -v - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-nginx composer -V - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-nginx composer1 -V - docker run kooldev/php:${{ matrix.version }}-nginx php -m | grep readline - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }}-nginx php -m - docker run kooldev/php:${{ matrix.version }}-nginx nginx -v - docker run kooldev/php:${{ matrix.version }}-nginx nginx -T - docker run kooldev/php:${{ matrix.version }}-nginx supervisord --version - - - name: Tests (nginx dev) - Dockerize - run: | - docker run kooldev/php:${{ matrix.version }}-nginx dockerize --version - docker run kooldev/php:${{ matrix.version }}-nginx sh -c 'echo "{{ .Env.TEST_VAR }}" > /tmp/test.tmpl && TEST_VAR=hello dockerize -template /tmp/test.tmpl:/tmp/test.out && cat /tmp/test.out | grep hello' - - - name: Tests (nginx dev) - PHP Extensions - run: | - docker run kooldev/php:${{ matrix.version }}-nginx php -m | grep -i bcmath - docker run kooldev/php:${{ matrix.version }}-nginx php -m | grep -i gd - docker run kooldev/php:${{ matrix.version }}-nginx php -m | grep -i intl - docker run kooldev/php:${{ matrix.version }}-nginx php -m | grep -i pdo_mysql - docker run kooldev/php:${{ matrix.version }}-nginx php -m | grep -i pdo_pgsql - docker run kooldev/php:${{ matrix.version }}-nginx php -m | grep -i redis - docker run kooldev/php:${{ matrix.version }}-nginx php -m | grep -i zip - docker run kooldev/php:${{ matrix.version }}-nginx php -m | grep -i mbstring - docker run kooldev/php:${{ matrix.version }}-nginx php -m | grep -i ldap - - - name: Tests (nginx dev) - Development Checks - run: | - docker run kooldev/php:${{ matrix.version }}-nginx php -m | grep -i pcov - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }}-nginx php -m | grep -i xdebug - - # ======================================== - # NGINX PROD IMAGE (uses local base prod) - # ======================================== - - name: Build nginx prod image - uses: docker/build-push-action@v6 - with: - context: ${{ matrix.version }}-nginx-prod - load: true - tags: kooldev/php:${{ matrix.version }}-nginx-prod - - - name: Tests (nginx prod) - Basic - run: | - docker run kooldev/php:${{ matrix.version }}-nginx-prod php -v - docker run kooldev/php:${{ matrix.version }}-nginx-prod composer -V - docker run kooldev/php:${{ matrix.version }}-nginx-prod composer1 -V - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-nginx-prod php -v - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-nginx-prod composer -V - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-nginx-prod composer1 -V - docker run kooldev/php:${{ matrix.version }}-nginx-prod php -m | grep readline - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }}-nginx-prod php -m - docker run kooldev/php:${{ matrix.version }}-nginx-prod nginx -v - docker run kooldev/php:${{ matrix.version }}-nginx-prod nginx -T - docker run kooldev/php:${{ matrix.version }}-nginx-prod supervisord --version - - - name: Tests (nginx prod) - Dockerize - run: | - docker run kooldev/php:${{ matrix.version }}-nginx-prod dockerize --version - docker run kooldev/php:${{ matrix.version }}-nginx-prod sh -c 'echo "{{ .Env.TEST_VAR }}" > /tmp/test.tmpl && TEST_VAR=hello dockerize -template /tmp/test.tmpl:/tmp/test.out && cat /tmp/test.out | grep hello' - - - name: Tests (nginx prod) - PHP Extensions - run: | - docker run kooldev/php:${{ matrix.version }}-nginx-prod php -m | grep -i bcmath - docker run kooldev/php:${{ matrix.version }}-nginx-prod php -m | grep -i gd - docker run kooldev/php:${{ matrix.version }}-nginx-prod php -m | grep -i intl - docker run kooldev/php:${{ matrix.version }}-nginx-prod php -m | grep -i pdo_mysql - docker run kooldev/php:${{ matrix.version }}-nginx-prod php -m | grep -i pdo_pgsql - docker run kooldev/php:${{ matrix.version }}-nginx-prod php -m | grep -i redis - docker run kooldev/php:${{ matrix.version }}-nginx-prod php -m | grep -i zip - docker run kooldev/php:${{ matrix.version }}-nginx-prod php -m | grep -i mbstring - docker run kooldev/php:${{ matrix.version }}-nginx-prod php -m | grep -i ldap - - - name: Tests (nginx prod) - Production Checks + - uses: actions/checkout@v6 + - name: Verify generated images match templates run: | - docker run kooldev/php:${{ matrix.version }}-nginx-prod php -m | grep -i "Zend OPcache" - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }}-nginx-prod php -m | grep -i xdebug && exit 1 || echo "OK: xdebug not in prod" + docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/app" fireworkweb/fwd:v1.0 fwd template + git diff --exit-code - # ======================================== - # NODE IMAGE (uses local base dev) - # ======================================== - - name: Build node image - uses: docker/build-push-action@v6 - with: - context: ${{ matrix.version }}-node - load: true - tags: kooldev/php:${{ matrix.version }}-node - - - name: Tests (node) - Basic - run: | - docker run kooldev/php:${{ matrix.version }}-node node -v - docker run kooldev/php:${{ matrix.version }}-node npm -v - docker run kooldev/php:${{ matrix.version }}-node yarn -v - - # =========================================== - # Debian: Build and Test (base + nginx per type) - # =========================================== - build-test-debian: + build-test: + needs: checks runs-on: ubuntu-latest - strategy: + fail-fast: false matrix: - version: ["8.4", "8.5"] + version: ["8.2", "8.3", "8.4", "8.5"] + distro: ["", "-debian"] type: ["", "-prod"] - + exclude: + - {version: "8.2", distro: "-debian"} + - {version: "8.3", distro: "-debian"} + env: + BASE: ${{ matrix.version }}${{ matrix.distro }}${{ matrix.type }} + NGINX: ${{ matrix.version }}${{ matrix.distro }}-nginx${{ matrix.type }} + NODE: ${{ matrix.version }}-node steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup QEMU - uses: docker/setup-qemu-action@v3 + - uses: actions/checkout@v6 - - name: Setup Docker Buildx (docker driver for local builds) - uses: docker/setup-buildx-action@v3 + # The docker driver lets derived images use the base built in this job. + # Tests are native amd64; QEMU is only needed for multi-arch publishing. + - uses: docker/setup-buildx-action@v4 with: driver: docker - # ======================================== - # BASE IMAGE (DEBIAN) - # ======================================== - - name: Build base image (Debian) - uses: docker/build-push-action@v6 + - name: Build base image + uses: docker/build-push-action@v7 with: - context: ${{ matrix.version }}-debian${{ matrix.type }} + context: ${{ env.BASE }} load: true - tags: kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} - - - name: Tests (Debian base) - Basic - run: | - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -v - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} composer -V - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} composer1 -V - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -v - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} composer -V - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} composer1 -V - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep readline - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m - - - name: Tests (Debian base) - Dockerize - run: | - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} dockerize --version - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} bash -c 'echo "{{ .Env.TEST_VAR }}" > /tmp/test.tmpl && TEST_VAR=hello dockerize -template /tmp/test.tmpl:/tmp/test.out && cat /tmp/test.out | grep hello' - - - name: Tests (Debian base) - Gosu user switching - run: | - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} gosu --version - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} id | grep "uid=1000" - - - name: Tests (Debian base) - PHP Extensions - run: | - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep -i bcmath - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep -i gd - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep -i intl - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep -i pdo_mysql - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep -i pdo_pgsql - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep -i redis - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep -i zip - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep -i mbstring - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep -i ldap + tags: kooldev/php:${{ env.BASE }} - - name: Tests (Debian base) - Production Checks - if: matrix.type == '-prod' - run: | - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep -i "Zend OPcache" - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep -i xdebug && exit 1 || echo "OK: xdebug not in prod" - - - name: Tests (Debian base) - Development Checks - if: matrix.type == '' - run: | - docker run kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep -i pcov - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} php -m | grep -i xdebug + - name: Test base image + run: bash scripts/test-image.sh "$BASE" - # ======================================== - # NGINX IMAGE (DEBIAN - uses local base) - # ======================================== - - name: Build nginx image (Debian) - uses: docker/build-push-action@v6 + - name: Build nginx image + uses: docker/build-push-action@v7 with: - context: ${{ matrix.version }}-debian-nginx${{ matrix.type }} + context: ${{ env.NGINX }} load: true - tags: kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} - - - name: Tests (Debian nginx) - Basic - run: | - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -v - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} composer -V - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} composer1 -V - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -v - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} composer -V - docker run -e ASUSER=1000 kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} composer1 -V - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep readline - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} nginx -v - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} nginx -T - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} supervisord --version - - - name: Tests (Debian nginx) - Dockerize - run: | - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} dockerize --version - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} bash -c 'echo "{{ .Env.TEST_VAR }}" > /tmp/test.tmpl && TEST_VAR=hello dockerize -template /tmp/test.tmpl:/tmp/test.out && cat /tmp/test.out | grep hello' - - - name: Tests (Debian nginx) - PHP Extensions - run: | - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep -i bcmath - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep -i gd - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep -i intl - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep -i pdo_mysql - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep -i pdo_pgsql - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep -i redis - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep -i zip - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep -i mbstring - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep -i ldap + tags: kooldev/php:${{ env.NGINX }} - - name: Tests (Debian nginx) - Production Checks - if: matrix.type == '-prod' - run: | - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep -i "Zend OPcache" - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep -i xdebug && exit 1 || echo "OK: xdebug not in prod" - - - name: Tests (Debian nginx) - Development Checks - if: matrix.type == '' - run: | - docker run kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep -i pcov - docker run -e ENABLE_XDEBUG=true kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} php -m | grep -i xdebug + - name: Test nginx image + run: bash scripts/test-image.sh "$NGINX" - # =========================================== - # PUSH JOBS (master branch only) - # =========================================== - # These jobs use docker-container driver (default) for multi-arch builds. - # They rebuild images because docker-container driver cannot access - # locally built images from the test jobs. - - # ------------------------------------------- - # Alpine Push: Base Images - # ------------------------------------------- - push-alpine-base: - needs: build-test-alpine - if: github.ref == 'refs/heads/master' && github.repository == 'kool-dev/docker-php' - runs-on: ubuntu-latest - - strategy: - matrix: - version: ["8.1", "8.2", "8.3", "8.4", "8.5"] - type: ["", "-prod"] - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup QEMU - uses: docker/setup-qemu-action@v3 - - - name: Setup Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 + - name: Build node image + if: matrix.distro == '' && matrix.type == '' + uses: docker/build-push-action@v7 with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} + context: ${{ env.NODE }} + load: true + tags: kooldev/php:${{ env.NODE }} - - name: Push base image - uses: docker/build-push-action@v6 - with: - context: ${{ matrix.version }}${{ matrix.type }} - push: true - platforms: linux/amd64,linux/arm64 - tags: kooldev/php:${{ matrix.version }}${{ matrix.type }} + - name: Test node image + if: matrix.distro == '' && matrix.type == '' + run: bash scripts/test-image.sh "$NODE" - # ------------------------------------------- - # Alpine Push: Nginx Images (depends on base) - # ------------------------------------------- - push-alpine-nginx: - needs: push-alpine-base - if: github.ref == 'refs/heads/master' && github.repository == 'kool-dev/docker-php' + # Multi-arch builds use the isolated docker-container driver. Publish all + # base images first so nginx/node builds can pull them from Docker Hub. + push-base: + needs: build-test + if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master' && github.repository == 'kool-dev/docker-php' runs-on: ubuntu-latest - strategy: + fail-fast: false matrix: - version: ["8.1", "8.2", "8.3", "8.4", "8.5"] + version: ["8.2", "8.3", "8.4", "8.5"] + distro: ["", "-debian"] type: ["", "-prod"] - + exclude: + - {version: "8.2", distro: "-debian"} + - {version: "8.3", distro: "-debian"} + env: + TAG: ${{ matrix.version }}${{ matrix.distro }}${{ matrix.type }} steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup QEMU - uses: docker/setup-qemu-action@v3 - - - name: Setup Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 + - uses: actions/checkout@v6 + - uses: docker/setup-qemu-action@v4 with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Push nginx image - uses: docker/build-push-action@v6 - with: - context: ${{ matrix.version }}-nginx${{ matrix.type }} - push: true - platforms: linux/amd64,linux/arm64 - tags: kooldev/php:${{ matrix.version }}-nginx${{ matrix.type }} - - # ------------------------------------------- - # Alpine Push: Node Images (depends on base) - # ------------------------------------------- - push-alpine-node: - needs: push-alpine-base - if: github.ref == 'refs/heads/master' && github.repository == 'kool-dev/docker-php' - runs-on: ubuntu-latest - - strategy: - matrix: - version: ["8.1", "8.2", "8.3", "8.4", "8.5"] - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup QEMU - uses: docker/setup-qemu-action@v3 - - - name: Setup Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 + platforms: arm64 + - uses: docker/setup-buildx-action@v4 + - uses: docker/login-action@v4 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Push node image - uses: docker/build-push-action@v6 + - name: Publish base image + uses: docker/build-push-action@v7 with: - context: ${{ matrix.version }}-node + context: ${{ env.TAG }} push: true platforms: linux/amd64,linux/arm64 - tags: kooldev/php:${{ matrix.version }}-node + tags: kooldev/php:${{ env.TAG }} - # ------------------------------------------- - # Debian Push: Base Images - # ------------------------------------------- - push-debian-base: - needs: build-test-debian - if: github.ref == 'refs/heads/master' && github.repository == 'kool-dev/docker-php' + push-nginx: + needs: push-base + if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master' && github.repository == 'kool-dev/docker-php' runs-on: ubuntu-latest - strategy: + fail-fast: false matrix: - version: ["8.4", "8.5"] + version: ["8.2", "8.3", "8.4", "8.5"] + distro: ["", "-debian"] type: ["", "-prod"] - + exclude: + - {version: "8.2", distro: "-debian"} + - {version: "8.3", distro: "-debian"} + env: + TAG: ${{ matrix.version }}${{ matrix.distro }}-nginx${{ matrix.type }} steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup QEMU - uses: docker/setup-qemu-action@v3 - - - name: Setup Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 + - uses: actions/checkout@v6 + - uses: docker/setup-qemu-action@v4 + with: + platforms: arm64 + - uses: docker/setup-buildx-action@v4 + - uses: docker/login-action@v4 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Push base image (Debian) - uses: docker/build-push-action@v6 + - name: Publish nginx image + uses: docker/build-push-action@v7 with: - context: ${{ matrix.version }}-debian${{ matrix.type }} + context: ${{ env.TAG }} push: true platforms: linux/amd64,linux/arm64 - tags: kooldev/php:${{ matrix.version }}-debian${{ matrix.type }} + tags: kooldev/php:${{ env.TAG }} - # ------------------------------------------- - # Debian Push: Nginx Images (depends on base) - # ------------------------------------------- - push-debian-nginx: - needs: push-debian-base - if: github.ref == 'refs/heads/master' && github.repository == 'kool-dev/docker-php' + push-node: + needs: push-base + if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master' && github.repository == 'kool-dev/docker-php' runs-on: ubuntu-latest - strategy: + fail-fast: false matrix: - version: ["8.4", "8.5"] - type: ["", "-prod"] - + version: ["8.2", "8.3", "8.4", "8.5"] + env: + TAG: ${{ matrix.version }}-node steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup QEMU - uses: docker/setup-qemu-action@v3 - - - name: Setup Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - uses: docker/login-action@v3 + - uses: actions/checkout@v6 + - uses: docker/setup-qemu-action@v4 + with: + platforms: arm64 + - uses: docker/setup-buildx-action@v4 + - uses: docker/login-action@v4 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Push nginx image (Debian) - uses: docker/build-push-action@v6 + - name: Publish node image + uses: docker/build-push-action@v7 with: - context: ${{ matrix.version }}-debian-nginx${{ matrix.type }} + context: ${{ env.TAG }} push: true platforms: linux/amd64,linux/arm64 - tags: kooldev/php:${{ matrix.version }}-debian-nginx${{ matrix.type }} - - # =========================================== - # DOWNSTREAM TRIGGERS (master branch only) - # =========================================== - # These jobs trigger builds in dependent repositories after all - # images have been successfully pushed to Docker Hub. + tags: kooldev/php:${{ env.TAG }} trigger-downstream: - needs: - - push-alpine-nginx - - push-alpine-node - - push-debian-nginx - if: github.ref == 'refs/heads/master' && github.repository == 'kool-dev/docker-php' + needs: [push-nginx, push-node] + if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master' && github.repository == 'kool-dev/docker-php' runs-on: ubuntu-latest - strategy: + fail-fast: false matrix: repo: - kool-dev/docker-wordpress - kool-dev/docker-php-sqlsrv - kool-dev/docker-php-swoole - kool-dev/docker-phpqa - steps: + - name: Check downstream credentials + id: credentials + env: + DISPATCH_TOKEN: ${{ secrets.DISPATCH_TOKEN }} + run: | + if [ -n "$DISPATCH_TOKEN" ]; then + echo "available=true" >> "$GITHUB_OUTPUT" + else + echo "::warning::Downstream builds skipped: configure DISPATCH_TOKEN with access to the downstream repositories." + fi - name: Trigger ${{ matrix.repo }} - uses: peter-evans/repository-dispatch@v3 + if: steps.credentials.outputs.available == 'true' + uses: peter-evans/repository-dispatch@v4 with: token: ${{ secrets.DISPATCH_TOKEN }} repository: ${{ matrix.repo }} diff --git a/.github/workflows/docker-description.yml b/.github/workflows/docker-description.yml index 6ec7320..0b1b8ab 100644 --- a/.github/workflows/docker-description.yml +++ b/.github/workflows/docker-description.yml @@ -8,6 +8,9 @@ on: - README.md - .github/workflows/docker-description.yml +permissions: + contents: read + jobs: docker-description: runs-on: ubuntu-latest @@ -16,7 +19,7 @@ jobs: - name: Sync Docker Hub Description uses: peter-evans/dockerhub-description@v5.0.0 - env: - DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} - DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} - DOCKERHUB_REPOSITORY: kooldev/php + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + repository: kooldev/php diff --git a/8.1-nginx-prod/Dockerfile b/8.1-nginx-prod/Dockerfile deleted file mode 100644 index e77897c..0000000 --- a/8.1-nginx-prod/Dockerfile +++ /dev/null @@ -1,60 +0,0 @@ -FROM debian AS cert - -WORKDIR /kool/ssl - -RUN apt-get update && \ - apt-get install -y openssl && \ - openssl genrsa -des3 -passout pass:x -out server.pass.key 2048 && \ - openssl rsa -passin pass:x -in server.pass.key -out _.localhost.key && \ - rm server.pass.key && \ - openssl req -new -key _.localhost.key -out server.csr \ - -subj "/C=XX/ST=XX/L=XX/O=Kool-Local/OU=Localhost/CN=*.localhost" && \ - openssl x509 -req -days 365 -in server.csr -signkey _.localhost.key -out _.localhost.crt && \ - openssl x509 -in _.localhost.crt -out _.localhost.pem - -FROM kooldev/php:8.1-prod - -ENV PHP_FPM_LISTEN=/run/php-fpm.sock \ - NGINX_LISTEN=80 \ - NGINX_HTTPS=false \ - NGINX_LISTEN_HTTPS=443 \ - NGINX_HTTPS_CERT=/kool/ssl/_.localhost.pem \ - NGINX_HTTPS_CERT_KEY=/kool/ssl/_.localhost.key \ - NGINX_ROOT=/app/public \ - NGINX_INDEX=index.php \ - NGINX_CLIENT_MAX_BODY_SIZE=25M \ - NGINX_PHP_FPM=unix:/run/php-fpm.sock \ - NGINX_FASTCGI_READ_TIMEOUT=60s \ - NGINX_FASTCGI_BUFFERS='8 8k' \ - NGINX_FASTCGI_BUFFER_SIZE='16k' \ - NGINX_ENTRYPOINT_WORKER_PROCESSES_AUTOTUNE=true - -RUN apk add --no-cache nginx supervisor \ - && chown -R kool:kool /var/lib/nginx \ - && chmod 770 /var/lib/nginx/tmp \ - && ln -sf /dev/stdout /var/log/nginx/access.log \ - && ln -sf /dev/stderr /var/log/nginx/error.log \ - # add h5bp/server-configs-nginx - && mkdir -p /etc/nginx/conf.d \ - && mkdir /etc/nginx/h5bp \ - && cd /etc/nginx/h5bp \ - && wget https://github.com/h5bp/server-configs-nginx/archive/refs/tags/5.0.1.tar.gz -O h5bp.tgz \ - && tar xzvf h5bp.tgz \ - && rm -f h5bp.tgz \ - && mv server-configs-nginx-*/h5bp/* . \ - && mv server-configs-nginx-*/nginx.conf /etc/nginx/nginx.conf \ - && sed -i "s|^user .*|user\ kool kool;|g" /etc/nginx/nginx.conf \ - && mv server-configs-nginx-*/mime.types /etc/nginx/mime.types \ - && rm -rf server-configs-nginx-* \ - && curl -L https://raw.githubusercontent.com/nginxinc/docker-nginx/master/entrypoint/30-tune-worker-processes.sh -o /kool/30-tune-worker-processes.sh \ - && chmod +x /kool/30-tune-worker-processes.sh - -COPY supervisor.conf /kool/supervisor.conf -COPY default.tmpl /kool/default.tmpl -COPY entrypoint /kool/entrypoint -COPY --from=cert /kool/ssl /kool/ssl -RUN chmod +x /kool/entrypoint - -EXPOSE 80 - -CMD [ "supervisord", "-c", "/kool/supervisor.conf" ] diff --git a/8.1-nginx-prod/default.tmpl b/8.1-nginx-prod/default.tmpl deleted file mode 100644 index a38b8df..0000000 --- a/8.1-nginx-prod/default.tmpl +++ /dev/null @@ -1,50 +0,0 @@ -server { - listen {{ .Env.NGINX_LISTEN }} default_server; - server_name _; -{{ if isTrue .Env.NGINX_HTTPS }} - listen {{ .Env.NGINX_LISTEN_HTTPS }} ssl http2; - ssl_certificate {{ .Env.NGINX_HTTPS_CERT }}; - ssl_certificate_key {{ .Env.NGINX_HTTPS_CERT_KEY }}; - ssl_protocols TLSv1.2 TLSv1.3; - ssl_ciphers HIGH:!aNULL:!MD5; -{{ end }} - root {{ .Env.NGINX_ROOT }}; - index {{ .Env.NGINX_INDEX }}; - charset utf-8; - - location = /favicon.ico { log_not_found off; access_log off; } - location = /robots.txt { log_not_found off; access_log off; } - - client_max_body_size {{ .Env.NGINX_CLIENT_MAX_BODY_SIZE }}; - - error_page 404 /index.php; - - location / { - try_files $uri $uri/ /{{ .Env.NGINX_INDEX }}?$query_string; - } - - location ~ \.php$ { - fastcgi_buffers {{ .Env.NGINX_FASTCGI_BUFFERS }}; - fastcgi_buffer_size {{ .Env.NGINX_FASTCGI_BUFFER_SIZE }}; - fastcgi_pass {{ .Env.NGINX_PHP_FPM }}; - fastcgi_read_timeout {{ .Env.NGINX_FASTCGI_READ_TIMEOUT }}; - fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - include fastcgi_params; - } - - location ~ /\.ht { - deny all; - } - - # good practices - add_header X-Frame-Options "SAMEORIGIN"; - - # basic H5BP suggestions - include h5bp/security/referrer-policy.conf; - include h5bp/security/x-content-type-options.conf; - include h5bp/cross-origin/requests.conf; - - # performance enhancements (mostly for caching static data) - include h5bp/web_performance/cache-file-descriptors.conf; - include h5bp/web_performance/compression.conf; -} diff --git a/8.1-nginx-prod/entrypoint b/8.1-nginx-prod/entrypoint deleted file mode 100644 index 535c40e..0000000 --- a/8.1-nginx-prod/entrypoint +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -set -e - - -# Run as current user -CURRENT_USER=${ASUSER:-${UID:-0}} - -if [ ! -z "$CURRENT_USER" ] && [ "$CURRENT_USER" != "0" ]; then - usermod -u $CURRENT_USER kool -fi - -dockerize -template /kool/kool.tmpl:/usr/local/etc/php/conf.d/kool.ini -template /kool/zz-docker.tmpl:/usr/local/etc/php-fpm.d/zz-docker.conf -template /kool/default.tmpl:/etc/nginx/conf.d/default.conf - -/kool/30-tune-worker-processes.sh - -# Run entrypoint if provided -if [ ! -z "$ENTRYPOINT" ] && [ -f "$ENTRYPOINT" ]; then - bash $ENTRYPOINT -fi - -if [ "$1" = "sh" ] || [ "$1" = "bash" ] || [ "$1" = "php-fpm" ] || [ "$1" = "nginx" ] || [ "$1" = "supervisord" ]; then - exec "$@" -else - exec su-exec kool "$@" -fi diff --git a/8.1-nginx-prod/supervisor.conf b/8.1-nginx-prod/supervisor.conf deleted file mode 100644 index 35e7cdb..0000000 --- a/8.1-nginx-prod/supervisor.conf +++ /dev/null @@ -1,27 +0,0 @@ -[supervisord] -logfile=/dev/stdout -logfile_maxbytes=0 -pidfile=/run/supervisord.pid -nodaemon=true - -[program:php-fpm] -command = php-fpm -priority = 10 -autorestart = true -stopasgroup = true -killasgroup = true -stderr_logfile = /dev/stderr -stdout_logfile = /dev/stdout -stderr_logfile_maxbytes = 0 -stdout_logfile_maxbytes = 0 - -[program:nginx] -command = nginx -g "daemon off;" -priority = 20 -autorestart = true -stopasgroup = true -killasgroup = true -stderr_logfile = /dev/stderr -stdout_logfile = /dev/stdout -stderr_logfile_maxbytes = 0 -stdout_logfile_maxbytes = 0 diff --git a/8.1-nginx/Dockerfile b/8.1-nginx/Dockerfile deleted file mode 100644 index 9785946..0000000 --- a/8.1-nginx/Dockerfile +++ /dev/null @@ -1,60 +0,0 @@ -FROM debian AS cert - -WORKDIR /kool/ssl - -RUN apt-get update && \ - apt-get install -y openssl && \ - openssl genrsa -des3 -passout pass:x -out server.pass.key 2048 && \ - openssl rsa -passin pass:x -in server.pass.key -out _.localhost.key && \ - rm server.pass.key && \ - openssl req -new -key _.localhost.key -out server.csr \ - -subj "/C=XX/ST=XX/L=XX/O=Kool-Local/OU=Localhost/CN=*.localhost" && \ - openssl x509 -req -days 365 -in server.csr -signkey _.localhost.key -out _.localhost.crt && \ - openssl x509 -in _.localhost.crt -out _.localhost.pem - -FROM kooldev/php:8.1 - -ENV PHP_FPM_LISTEN=/run/php-fpm.sock \ - NGINX_LISTEN=80 \ - NGINX_HTTPS=false \ - NGINX_LISTEN_HTTPS=443 \ - NGINX_HTTPS_CERT=/kool/ssl/_.localhost.pem \ - NGINX_HTTPS_CERT_KEY=/kool/ssl/_.localhost.key \ - NGINX_ROOT=/app/public \ - NGINX_INDEX=index.php \ - NGINX_CLIENT_MAX_BODY_SIZE=25M \ - NGINX_PHP_FPM=unix:/run/php-fpm.sock \ - NGINX_FASTCGI_READ_TIMEOUT=60s \ - NGINX_FASTCGI_BUFFERS='8 8k' \ - NGINX_FASTCGI_BUFFER_SIZE='16k' \ - NGINX_ENTRYPOINT_WORKER_PROCESSES_AUTOTUNE=true - -RUN apk add --no-cache nginx supervisor \ - && chown -R kool:kool /var/lib/nginx \ - && chmod 770 /var/lib/nginx/tmp \ - && ln -sf /dev/stdout /var/log/nginx/access.log \ - && ln -sf /dev/stderr /var/log/nginx/error.log \ - # add h5bp/server-configs-nginx - && mkdir -p /etc/nginx/conf.d \ - && mkdir /etc/nginx/h5bp \ - && cd /etc/nginx/h5bp \ - && wget https://github.com/h5bp/server-configs-nginx/archive/refs/tags/5.0.1.tar.gz -O h5bp.tgz \ - && tar xzvf h5bp.tgz \ - && rm -f h5bp.tgz \ - && mv server-configs-nginx-*/h5bp/* . \ - && mv server-configs-nginx-*/nginx.conf /etc/nginx/nginx.conf \ - && sed -i "s|^user .*|user\ kool kool;|g" /etc/nginx/nginx.conf \ - && mv server-configs-nginx-*/mime.types /etc/nginx/mime.types \ - && rm -rf server-configs-nginx-* \ - && curl -L https://raw.githubusercontent.com/nginxinc/docker-nginx/master/entrypoint/30-tune-worker-processes.sh -o /kool/30-tune-worker-processes.sh \ - && chmod +x /kool/30-tune-worker-processes.sh - -COPY supervisor.conf /kool/supervisor.conf -COPY default.tmpl /kool/default.tmpl -COPY entrypoint /kool/entrypoint -COPY --from=cert /kool/ssl /kool/ssl -RUN chmod +x /kool/entrypoint - -EXPOSE 80 - -CMD [ "supervisord", "-c", "/kool/supervisor.conf" ] diff --git a/8.1-nginx/default.tmpl b/8.1-nginx/default.tmpl deleted file mode 100644 index a38b8df..0000000 --- a/8.1-nginx/default.tmpl +++ /dev/null @@ -1,50 +0,0 @@ -server { - listen {{ .Env.NGINX_LISTEN }} default_server; - server_name _; -{{ if isTrue .Env.NGINX_HTTPS }} - listen {{ .Env.NGINX_LISTEN_HTTPS }} ssl http2; - ssl_certificate {{ .Env.NGINX_HTTPS_CERT }}; - ssl_certificate_key {{ .Env.NGINX_HTTPS_CERT_KEY }}; - ssl_protocols TLSv1.2 TLSv1.3; - ssl_ciphers HIGH:!aNULL:!MD5; -{{ end }} - root {{ .Env.NGINX_ROOT }}; - index {{ .Env.NGINX_INDEX }}; - charset utf-8; - - location = /favicon.ico { log_not_found off; access_log off; } - location = /robots.txt { log_not_found off; access_log off; } - - client_max_body_size {{ .Env.NGINX_CLIENT_MAX_BODY_SIZE }}; - - error_page 404 /index.php; - - location / { - try_files $uri $uri/ /{{ .Env.NGINX_INDEX }}?$query_string; - } - - location ~ \.php$ { - fastcgi_buffers {{ .Env.NGINX_FASTCGI_BUFFERS }}; - fastcgi_buffer_size {{ .Env.NGINX_FASTCGI_BUFFER_SIZE }}; - fastcgi_pass {{ .Env.NGINX_PHP_FPM }}; - fastcgi_read_timeout {{ .Env.NGINX_FASTCGI_READ_TIMEOUT }}; - fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - include fastcgi_params; - } - - location ~ /\.ht { - deny all; - } - - # good practices - add_header X-Frame-Options "SAMEORIGIN"; - - # basic H5BP suggestions - include h5bp/security/referrer-policy.conf; - include h5bp/security/x-content-type-options.conf; - include h5bp/cross-origin/requests.conf; - - # performance enhancements (mostly for caching static data) - include h5bp/web_performance/cache-file-descriptors.conf; - include h5bp/web_performance/compression.conf; -} diff --git a/8.1-nginx/entrypoint b/8.1-nginx/entrypoint deleted file mode 100644 index 2780e2e..0000000 --- a/8.1-nginx/entrypoint +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh -set -e - -if [ "$ENABLE_XDEBUG" == "true" ]; then - docker-php-ext-enable xdebug >> /dev/null 2>&1 - - if [ $? != "0" ]; then - echo "[ERROR] An error happened enabling xdebug" - - exit 1 - fi -fi - -# Run as current user -CURRENT_USER=${ASUSER:-${UID:-0}} - -if [ ! -z "$CURRENT_USER" ] && [ "$CURRENT_USER" != "0" ]; then - usermod -u $CURRENT_USER kool -fi - -dockerize -template /kool/kool.tmpl:/usr/local/etc/php/conf.d/kool.ini -template /kool/zz-docker.tmpl:/usr/local/etc/php-fpm.d/zz-docker.conf -template /kool/default.tmpl:/etc/nginx/conf.d/default.conf - -/kool/30-tune-worker-processes.sh - -# Run entrypoint if provided -if [ ! -z "$ENTRYPOINT" ] && [ -f "$ENTRYPOINT" ]; then - bash $ENTRYPOINT -fi - -if [ "$1" = "sh" ] || [ "$1" = "bash" ] || [ "$1" = "php-fpm" ] || [ "$1" = "nginx" ] || [ "$1" = "supervisord" ]; then - exec "$@" -else - exec su-exec kool "$@" -fi diff --git a/8.1-nginx/supervisor.conf b/8.1-nginx/supervisor.conf deleted file mode 100644 index 35e7cdb..0000000 --- a/8.1-nginx/supervisor.conf +++ /dev/null @@ -1,27 +0,0 @@ -[supervisord] -logfile=/dev/stdout -logfile_maxbytes=0 -pidfile=/run/supervisord.pid -nodaemon=true - -[program:php-fpm] -command = php-fpm -priority = 10 -autorestart = true -stopasgroup = true -killasgroup = true -stderr_logfile = /dev/stderr -stdout_logfile = /dev/stdout -stderr_logfile_maxbytes = 0 -stdout_logfile_maxbytes = 0 - -[program:nginx] -command = nginx -g "daemon off;" -priority = 20 -autorestart = true -stopasgroup = true -killasgroup = true -stderr_logfile = /dev/stderr -stdout_logfile = /dev/stdout -stderr_logfile_maxbytes = 0 -stdout_logfile_maxbytes = 0 diff --git a/8.1-node/Dockerfile b/8.1-node/Dockerfile deleted file mode 100644 index 90d7269..0000000 --- a/8.1-node/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM kooldev/php:8.1 - -RUN apk add --update --no-cache npm yarn \ - && rm -rf /var/cache/apk/* /tmp/* diff --git a/8.1-prod/Dockerfile b/8.1-prod/Dockerfile deleted file mode 100644 index 042f76b..0000000 --- a/8.1-prod/Dockerfile +++ /dev/null @@ -1,80 +0,0 @@ -FROM php:8.1-fpm-alpine - -ENV ASUSER= \ - UID= \ - COMPOSER_ALLOW_SUPERUSER=1 \ - COMPOSER_MEMORY_LIMIT=-1 \ - PHP_DATE_TIMEZONE=UTC \ - PHP_MEMORY_LIMIT=256M \ - PHP_MAX_INPUT_VARS=1000 \ - PHP_UPLOAD_MAX_FILESIZE=25M \ - PHP_POST_MAX_SIZE=25M \ - PHP_MAX_EXECUTION_TIME=30 \ - PHP_FPM_LISTEN=9000 \ - PHP_FPM_MAX_CHILDREN=10 \ - PHP_FPM_REQUEST_TERMINATE_TIMEOUT=60 \ - ENTRYPOINT=entrypoint.php.sh - -WORKDIR /app - -RUN adduser -D -u 1337 kool \ - && addgroup kool www-data \ - # dockerize - && DOCKERIZE_ARCH="$( [ "$(uname -m)" = "aarch64" ] && echo arm64 || echo amd64 )" \ - && curl -L "https://github.com/jwilder/dockerize/releases/download/v0.9.3/dockerize-linux-${DOCKERIZE_ARCH}-v0.9.3.tar.gz" | tar xz \ - && mv dockerize /usr/local/bin/dockerize \ - # deps - && apk --no-cache add su-exec bash sed git openssh-client icu shadow procps \ - freetype libpng libjpeg-turbo libzip-dev ghostscript imagemagick \ - jpegoptim optipng pngquant gifsicle libldap \ - libpq less \ - # build-deps - && cp "/usr/local/etc/php/php.ini-production" "/usr/local/etc/php/php.ini" \ - && apk add --no-cache --virtual .build-deps $PHPIZE_DEPS \ - freetype-dev libpng-dev libjpeg-turbo-dev \ - icu-dev libedit-dev libxml2-dev \ - imagemagick-dev openldap-dev oniguruma-dev libwebp-dev \ - postgresql-dev \ - linux-headers \ - # php-ext - && docker-php-ext-configure gd --with-freetype --with-webp --with-jpeg \ - && export CFLAGS="$PHP_CFLAGS" CPPFLAGS="$PHP_CPPFLAGS" LDFLAGS="$PHP_LDFLAGS" \ - && docker-php-ext-install -j$(nproc) \ - bcmath \ - calendar \ - exif \ - gd \ - intl \ - ldap \ - mbstring \ - opcache \ - pcntl \ - pdo \ - pdo_mysql \ - pdo_pgsql \ - soap \ - xml \ - zip \ - sockets \ - mysqli \ - ftp \ - && pecl install redis \ - && pecl install imagick \ - && docker-php-ext-enable imagick \ - && docker-php-ext-enable redis \ - # composer - && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \ - && curl -sS https://getcomposer.org/installer | php -- --1 --install-dir=/usr/local/bin --filename=composer1 \ - # cleanup - && apk del .build-deps \ - && rm -rf /var/cache/apk/* /tmp/* - -COPY kool.ini /kool/kool.tmpl -COPY zz-docker.conf /kool/zz-docker.tmpl -COPY entrypoint /kool/entrypoint -RUN chmod +x /kool/entrypoint - -EXPOSE 9000 - -ENTRYPOINT [ "/kool/entrypoint" ] -CMD [ "php-fpm" ] diff --git a/8.1-prod/entrypoint b/8.1-prod/entrypoint deleted file mode 100644 index 2036291..0000000 --- a/8.1-prod/entrypoint +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh -set -e - - -# Run as current user -CURRENT_USER=${ASUSER:-${UID:-0}} - -if [ ! -z "$CURRENT_USER" ] && [ "$CURRENT_USER" != "0" ]; then - usermod -u $CURRENT_USER kool -fi - -dockerize -template /kool/kool.tmpl:/usr/local/etc/php/conf.d/kool.ini -template /kool/zz-docker.tmpl:/usr/local/etc/php-fpm.d/zz-docker.conf - - -# Run entrypoint if provided -if [ ! -z "$ENTRYPOINT" ] && [ -f "$ENTRYPOINT" ]; then - bash $ENTRYPOINT -fi - -if [ "$1" = "sh" ] || [ "$1" = "bash" ] || [ "$1" = "php-fpm" ] ; then - exec "$@" -else - exec su-exec kool "$@" -fi diff --git a/8.1-prod/kool.ini b/8.1-prod/kool.ini deleted file mode 100644 index 3028217..0000000 --- a/8.1-prod/kool.ini +++ /dev/null @@ -1,51 +0,0 @@ -[PHP] - -; Maximum amount of memory a script may consume -; http://php.net/memory-limit -memory_limit = {{ .Env.PHP_MEMORY_LIMIT }} - -; Fix maximum variables per input -max_input_vars = {{ .Env.PHP_MAX_INPUT_VARS }} - -; Maximum allowed size for uploaded files. -; http://php.net/upload-max-filesize -upload_max_filesize = {{ .Env.PHP_UPLOAD_MAX_FILESIZE }} - -; Maximum size of POST data that PHP will accept. -; Its value may be 0 to disable the limit. It is ignored if POST data reading -; is disabled through enable_post_data_reading. -; http://php.net/post-max-size -post_max_size = {{ .Env.PHP_POST_MAX_SIZE }} - -; Maximum execution time of each script, in seconds -; http://php.net/max-execution-time -; Note: This directive is hardcoded to 0 for the CLI SAPI -max_execution_time = {{ .Env.PHP_MAX_EXECUTION_TIME }} - -; Default timezone used by all date/time functions. -; https://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone -date.timezone = {{ .Env.PHP_DATE_TIMEZONE }} - - -[opcache] - -; Determines if Zend OPCache is enabled -opcache.enable=1 - -; The OPcache shared memory storage size. -opcache.memory_consumption=512 - -; The amount of memory for interned strings in Mbytes. -opcache.interned_strings_buffer=64 - -; The maximum number of keys (scripts) in the OPcache hash table. -; Only numbers between 200 and 1000000 are allowed. -opcache.max_accelerated_files=30000 - -; When disabled, you must reset the OPcache manually or restart the -; webserver for changes to the filesystem to take effect. -opcache.validate_timestamps=0 - -; If disabled, all PHPDoc comments are dropped from the code to reduce the -; size of the optimized code. -opcache.save_comments=1 diff --git a/8.1-prod/zz-docker.conf b/8.1-prod/zz-docker.conf deleted file mode 100644 index 33adb1b..0000000 --- a/8.1-prod/zz-docker.conf +++ /dev/null @@ -1,53 +0,0 @@ -[global] -daemonize = no - -[www] -; Unix user/group of processes -; Note: The user is mandatory. If the group is not set, the default user's group -; will be used. -user = kool -group = kool - -; The address on which to accept FastCGI requests. -; Valid syntaxes are: -; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on -; a specific port; -; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on -; a specific port; -; 'port' - to listen on a TCP socket to all addresses -; (IPv6 and IPv4-mapped) on a specific port; -; '/path/to/unix/socket' - to listen on a unix socket. -; Note: This value is mandatory. -listen = {{ .Env.PHP_FPM_LISTEN }} - -; Set permissions for unix socket, if one is used. In Linux, read/write -; permissions must be set in order to allow connections from a web server. Many -; BSD-derived systems allow connections regardless of permissions. The owner -; and group can be specified either by name or by their numeric IDs. -; Default Values: user and group are set as the running user -; mode is set to 0660 -listen.owner = kool -listen.group = kool - -; Choose how the process manager will control the number of child processes. -; Possible Values: static, dynamic, ondemand (check www.conf for full documentation). -; Note: This value is mandatory. -{{ if or (eq .Env.PHP_FPM_PM "static") (eq .Env.PHP_FPM_PM "dynamic") (eq .Env.PHP_FPM_PM "ondemand") }}pm = {{ .Env.PHP_FPM_PM }}{{ else }}pm = dynamic{{ end }} - -; The number of child processes to be created when pm is set to 'static' and the -; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. -; This value sets the limit on the number of simultaneous requests that will be -; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. -; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP -; CGI. The below defaults are based on a server without much resources. Don't -; forget to tweak pm.* to fit your needs. -; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' -; Note: This value is mandatory. -pm.max_children = {{ .Env.PHP_FPM_MAX_CHILDREN }} - -; The timeout for serving a single request after which the worker process will -; be killed. This option should be used when the 'max_execution_time' ini option -; does not stop script execution for some reason. A value of '0' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -request_terminate_timeout = {{ .Env.PHP_FPM_REQUEST_TERMINATE_TIMEOUT }} diff --git a/8.1/Dockerfile b/8.1/Dockerfile deleted file mode 100644 index f767f88..0000000 --- a/8.1/Dockerfile +++ /dev/null @@ -1,82 +0,0 @@ -FROM php:8.1-fpm-alpine - -ENV ASUSER= \ - UID= \ - COMPOSER_ALLOW_SUPERUSER=1 \ - COMPOSER_MEMORY_LIMIT=-1 \ - ENABLE_XDEBUG=false \ - PHP_DATE_TIMEZONE=UTC \ - PHP_MEMORY_LIMIT=256M \ - PHP_MAX_INPUT_VARS=1000 \ - PHP_UPLOAD_MAX_FILESIZE=25M \ - PHP_POST_MAX_SIZE=25M \ - PHP_MAX_EXECUTION_TIME=30 \ - PHP_FPM_LISTEN=9000 \ - PHP_FPM_MAX_CHILDREN=10 \ - PHP_FPM_REQUEST_TERMINATE_TIMEOUT=60 \ - ENTRYPOINT=entrypoint.php.sh - -WORKDIR /app - -RUN adduser -D -u 1337 kool \ - && addgroup kool www-data \ - # dockerize - && DOCKERIZE_ARCH="$( [ "$(uname -m)" = "aarch64" ] && echo arm64 || echo amd64 )" \ - && curl -L "https://github.com/jwilder/dockerize/releases/download/v0.9.3/dockerize-linux-${DOCKERIZE_ARCH}-v0.9.3.tar.gz" | tar xz \ - && mv dockerize /usr/local/bin/dockerize \ - # deps - && apk --no-cache add su-exec bash sed git openssh-client icu shadow procps \ - freetype libpng libjpeg-turbo libzip-dev ghostscript imagemagick \ - jpegoptim optipng pngquant gifsicle libldap \ - libpq less \ - # build-deps - && cp "/usr/local/etc/php/php.ini-development" "/usr/local/etc/php/php.ini" \ - && apk add --no-cache --virtual .build-deps $PHPIZE_DEPS \ - freetype-dev libpng-dev libjpeg-turbo-dev \ - icu-dev libedit-dev libxml2-dev \ - imagemagick-dev openldap-dev oniguruma-dev libwebp-dev \ - postgresql-dev \ - linux-headers \ - # php-ext - && docker-php-ext-configure gd --with-freetype --with-webp --with-jpeg \ - && export CFLAGS="$PHP_CFLAGS" CPPFLAGS="$PHP_CPPFLAGS" LDFLAGS="$PHP_LDFLAGS" \ - && docker-php-ext-install -j$(nproc) \ - bcmath \ - calendar \ - exif \ - gd \ - intl \ - ldap \ - mbstring \ - pcntl \ - pdo \ - pdo_mysql \ - pdo_pgsql \ - soap \ - xml \ - zip \ - sockets \ - mysqli \ - ftp \ - && pecl install redis \ - && pecl install xdebug \ - && pecl install pcov && docker-php-ext-enable pcov \ - && pecl install imagick \ - && docker-php-ext-enable imagick \ - && docker-php-ext-enable redis \ - # composer - && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \ - && curl -sS https://getcomposer.org/installer | php -- --1 --install-dir=/usr/local/bin --filename=composer1 \ - # cleanup - && apk del .build-deps \ - && rm -rf /var/cache/apk/* /tmp/* - -COPY kool.ini /kool/kool.tmpl -COPY zz-docker.conf /kool/zz-docker.tmpl -COPY entrypoint /kool/entrypoint -RUN chmod +x /kool/entrypoint - -EXPOSE 9000 - -ENTRYPOINT [ "/kool/entrypoint" ] -CMD [ "php-fpm" ] diff --git a/8.1/entrypoint b/8.1/entrypoint deleted file mode 100644 index 050f40a..0000000 --- a/8.1/entrypoint +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh -set -e - -if [ "$ENABLE_XDEBUG" == "true" ]; then - docker-php-ext-enable xdebug >> /dev/null 2>&1 - - if [ $? != "0" ]; then - echo "[ERROR] An error happened enabling xdebug" - - exit 1 - fi -fi - -# Run as current user -CURRENT_USER=${ASUSER:-${UID:-0}} - -if [ ! -z "$CURRENT_USER" ] && [ "$CURRENT_USER" != "0" ]; then - usermod -u $CURRENT_USER kool -fi - -dockerize -template /kool/kool.tmpl:/usr/local/etc/php/conf.d/kool.ini -template /kool/zz-docker.tmpl:/usr/local/etc/php-fpm.d/zz-docker.conf - - -# Run entrypoint if provided -if [ ! -z "$ENTRYPOINT" ] && [ -f "$ENTRYPOINT" ]; then - bash $ENTRYPOINT -fi - -if [ "$1" = "sh" ] || [ "$1" = "bash" ] || [ "$1" = "php-fpm" ] ; then - exec "$@" -else - exec su-exec kool "$@" -fi diff --git a/8.1/kool.ini b/8.1/kool.ini deleted file mode 100644 index c671911..0000000 --- a/8.1/kool.ini +++ /dev/null @@ -1,29 +0,0 @@ -[PHP] - -; Maximum amount of memory a script may consume -; http://php.net/memory-limit -memory_limit = {{ .Env.PHP_MEMORY_LIMIT }} - -; Fix maximum variables per input -max_input_vars = {{ .Env.PHP_MAX_INPUT_VARS }} - -; Maximum allowed size for uploaded files. -; http://php.net/upload-max-filesize -upload_max_filesize = {{ .Env.PHP_UPLOAD_MAX_FILESIZE }} - -; Maximum size of POST data that PHP will accept. -; Its value may be 0 to disable the limit. It is ignored if POST data reading -; is disabled through enable_post_data_reading. -; http://php.net/post-max-size -post_max_size = {{ .Env.PHP_POST_MAX_SIZE }} - -; Maximum execution time of each script, in seconds -; http://php.net/max-execution-time -; Note: This directive is hardcoded to 0 for the CLI SAPI -max_execution_time = {{ .Env.PHP_MAX_EXECUTION_TIME }} - -; Default timezone used by all date/time functions. -; https://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone -date.timezone = {{ .Env.PHP_DATE_TIMEZONE }} - - diff --git a/8.1/zz-docker.conf b/8.1/zz-docker.conf deleted file mode 100644 index 33adb1b..0000000 --- a/8.1/zz-docker.conf +++ /dev/null @@ -1,53 +0,0 @@ -[global] -daemonize = no - -[www] -; Unix user/group of processes -; Note: The user is mandatory. If the group is not set, the default user's group -; will be used. -user = kool -group = kool - -; The address on which to accept FastCGI requests. -; Valid syntaxes are: -; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on -; a specific port; -; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on -; a specific port; -; 'port' - to listen on a TCP socket to all addresses -; (IPv6 and IPv4-mapped) on a specific port; -; '/path/to/unix/socket' - to listen on a unix socket. -; Note: This value is mandatory. -listen = {{ .Env.PHP_FPM_LISTEN }} - -; Set permissions for unix socket, if one is used. In Linux, read/write -; permissions must be set in order to allow connections from a web server. Many -; BSD-derived systems allow connections regardless of permissions. The owner -; and group can be specified either by name or by their numeric IDs. -; Default Values: user and group are set as the running user -; mode is set to 0660 -listen.owner = kool -listen.group = kool - -; Choose how the process manager will control the number of child processes. -; Possible Values: static, dynamic, ondemand (check www.conf for full documentation). -; Note: This value is mandatory. -{{ if or (eq .Env.PHP_FPM_PM "static") (eq .Env.PHP_FPM_PM "dynamic") (eq .Env.PHP_FPM_PM "ondemand") }}pm = {{ .Env.PHP_FPM_PM }}{{ else }}pm = dynamic{{ end }} - -; The number of child processes to be created when pm is set to 'static' and the -; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. -; This value sets the limit on the number of simultaneous requests that will be -; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. -; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP -; CGI. The below defaults are based on a server without much resources. Don't -; forget to tweak pm.* to fit your needs. -; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' -; Note: This value is mandatory. -pm.max_children = {{ .Env.PHP_FPM_MAX_CHILDREN }} - -; The timeout for serving a single request after which the worker process will -; be killed. This option should be used when the 'max_execution_time' ini option -; does not stop script execution for some reason. A value of '0' means 'off'. -; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) -; Default Value: 0 -request_terminate_timeout = {{ .Env.PHP_FPM_REQUEST_TERMINATE_TIMEOUT }} diff --git a/README.md b/README.md index cdb663b..410fa78 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## Description -Minimal PHP Docker image focused on Laravel applications. It's use is intended for [kool.dev](https://github.com/kool-dev/kool), but can fit in any other PHP use-case. +PHP Docker images focused on Laravel applications. They're intended for [kool.dev](https://github.com/kool-dev/kool), but can fit other PHP use cases. The images with Nginx include [`h5bp/server-configs-nginx`](https://github.com/h5bp/server-configs-nginx) with a hand picked set of configuration active by default. So if you want to change or add a new server configuration you can `include h5bp/...` as you see fit. @@ -20,35 +20,39 @@ Simplest example: The image built is [`kooldev/php`](https://hub.docker.com/r/kooldev/php/tags?page=1&ordering=last_updated) which has a bunch of tags available: +The default images use Alpine Linux. PHP 8.4 and 8.5 also offer Debian Bookworm variants. All maintained tags are published for `linux/amd64` and `linux/arm64`. + ### 8.5 - [8.5](https://github.com/kool-dev/docker-php/blob/master/8.5/Dockerfile) and [8.5-prod](https://github.com/kool-dev/docker-php/blob/master/8.5-prod/Dockerfile) - [8.5-nginx](https://github.com/kool-dev/docker-php/blob/master/8.5-nginx/Dockerfile) and [8.5-nginx-prod](https://github.com/kool-dev/docker-php/blob/master/8.5-nginx-prod/Dockerfile) +- [8.5-node](https://github.com/kool-dev/docker-php/blob/master/8.5-node/Dockerfile) +- [8.5-debian](https://github.com/kool-dev/docker-php/blob/master/8.5-debian/Dockerfile) and [8.5-debian-prod](https://github.com/kool-dev/docker-php/blob/master/8.5-debian-prod/Dockerfile) +- [8.5-debian-nginx](https://github.com/kool-dev/docker-php/blob/master/8.5-debian-nginx/Dockerfile) and [8.5-debian-nginx-prod](https://github.com/kool-dev/docker-php/blob/master/8.5-debian-nginx-prod/Dockerfile) ### 8.4 - [8.4](https://github.com/kool-dev/docker-php/blob/master/8.4/Dockerfile) and [8.4-prod](https://github.com/kool-dev/docker-php/blob/master/8.4-prod/Dockerfile) - [8.4-nginx](https://github.com/kool-dev/docker-php/blob/master/8.4-nginx/Dockerfile) and [8.4-nginx-prod](https://github.com/kool-dev/docker-php/blob/master/8.4-nginx-prod/Dockerfile) +- [8.4-node](https://github.com/kool-dev/docker-php/blob/master/8.4-node/Dockerfile) +- [8.4-debian](https://github.com/kool-dev/docker-php/blob/master/8.4-debian/Dockerfile) and [8.4-debian-prod](https://github.com/kool-dev/docker-php/blob/master/8.4-debian-prod/Dockerfile) +- [8.4-debian-nginx](https://github.com/kool-dev/docker-php/blob/master/8.4-debian-nginx/Dockerfile) and [8.4-debian-nginx-prod](https://github.com/kool-dev/docker-php/blob/master/8.4-debian-nginx-prod/Dockerfile) ### 8.3 - [8.3](https://github.com/kool-dev/docker-php/blob/master/8.3/Dockerfile) and [8.3-prod](https://github.com/kool-dev/docker-php/blob/master/8.3-prod/Dockerfile) - [8.3-nginx](https://github.com/kool-dev/docker-php/blob/master/8.3-nginx/Dockerfile) and [8.3-nginx-prod](https://github.com/kool-dev/docker-php/blob/master/8.3-nginx-prod/Dockerfile) +- [8.3-node](https://github.com/kool-dev/docker-php/blob/master/8.3-node/Dockerfile) ### 8.2 - [8.2](https://github.com/kool-dev/docker-php/blob/master/8.2/Dockerfile) and [8.2-prod](https://github.com/kool-dev/docker-php/blob/master/8.2-prod/Dockerfile) - [8.2-nginx](https://github.com/kool-dev/docker-php/blob/master/8.2-nginx/Dockerfile) and [8.2-nginx-prod](https://github.com/kool-dev/docker-php/blob/master/8.2-nginx-prod/Dockerfile) - -### 8.1 - -- [8.1](https://github.com/kool-dev/docker-php/blob/master/8.1/Dockerfile) and [8.1-prod](https://github.com/kool-dev/docker-php/blob/master/8.1-prod/Dockerfile) -- [8.1-nginx](https://github.com/kool-dev/docker-php/blob/master/8.1-nginx/Dockerfile) and [8.1-nginx-prod](https://github.com/kool-dev/docker-php/blob/master/8.1-nginx-prod/Dockerfile) +- [8.2-node](https://github.com/kool-dev/docker-php/blob/master/8.2-node/Dockerfile) ### Legacy versions -- [8.0](https://github.com/kool-dev/docker-php/blob/master/8.0/Dockerfile), [8.0-prod](https://github.com/kool-dev/docker-php/blob/master/8.0-prod/Dockerfile), [8.0-nginx](https://github.com/kool-dev/docker-php/blob/master/8.0-nginx/Dockerfile), [8.0-nginx-prod](https://github.com/kool-dev/docker-php/blob/master/8.0-nginx-prod/Dockerfile) -- [7.4](https://github.com/kool-dev/docker-php/blob/master/7.4/Dockerfile), [7.4-prod](https://github.com/kool-dev/docker-php/blob/master/7.4-prod/Dockerfile), [7.4-nginx](https://github.com/kool-dev/docker-php/blob/master/7.4-nginx/Dockerfile), [7.4-nginx-prod](https://github.com/kool-dev/docker-php/blob/master/7.4-nginx-prod/Dockerfile). +PHP 8.1, 8.0, and 7.4 are end-of-life upstream. Their tags remain on [Docker Hub](https://hub.docker.com/r/kooldev/php/tags), but are no longer built from this repository and receive no updates. Upgrade to a supported PHP version for new deployments. ## More flavours @@ -101,27 +105,27 @@ Variable | Default Value | Description With `docker run`: ```sh -docker run -it --rm kooldev/php:7.4 php -v +docker run -it --rm kooldev/php:8.5 php -v ``` With environment variables: ```sh -docker run -it --rm -e ENABLE_XDEBUG=true kooldev/php:7.4-prod php -v +docker run -it --rm -e ENABLE_XDEBUG=true kooldev/php:8.5 php -v ``` With `docker-compose.yml`: ```yaml app: - image: kooldev/php:8.2 + image: kooldev/php:8.5 ports: - "9773:9773" volumes: - ".:/app:cached" - "$HOME/.ssh/id_rsa:/home/developer/.ssh/id_rsa:cached" environment: - ASUSER: "${$UID}" + ASUSER: "${UID:-1000}" ``` ## Contributing @@ -132,6 +136,17 @@ You should change `fwd-template.json` for configuration and `template` folder fo After any changes, we need to run `kool run template` to parse the templates and generate all versions folder/files. +### Testing and publishing + +Run `bash scripts/test-image.sh 8.5` to test a locally built image (replace the tag for other variants). CI uses the same script for every image, building base images before their nginx and node variants so tests use the local base rather than a published tag. + +Pull requests build and test without publishing or accessing secrets. Pushes to `master`, weekly scheduled runs, and manual runs on `master` also publish multi-architecture images, with base images published before derived images. + +Repository secrets: + +- `DOCKER_USERNAME` and `DOCKER_PASSWORD`: Docker Hub credentials for publishing images and syncing this README. +- `DISPATCH_TOKEN`: token with access to the downstream repositories and permission to send repository dispatch events (fine-grained tokens need Contents write). Without it, CI publishes images but warns and skips downstream builds. + ## License The MIT License (MIT). Please see [License File](LICENSE.md) for more information. diff --git a/fwd-template.json b/fwd-template.json index aab1f39..3ec6c3d 100644 --- a/fwd-template.json +++ b/fwd-template.json @@ -1,127 +1,6 @@ { "output": ".", "builds": [ - { - "name": "8.1", - "data": { - "from": "php:8.1-fpm-alpine", - "prod": false, - "nginx": false, - "version": "8.1" - }, - "files": [ - { - "name": "Dockerfile", - "path": "template/Dockerfile" - }, - { - "name": "entrypoint", - "path": "template/entrypoint" - }, - { - "name": "kool.ini", - "path": "template/kool-ini" - }, - { - "name": "zz-docker.conf", - "path": "template/zz-docker-conf" - } - ] - }, - { - "name": "8.1-prod", - "data": { - "from": "php:8.1-fpm-alpine", - "prod": true, - "nginx": false, - "version": "8.1" - }, - "files": [ - { - "name": "Dockerfile", - "path": "template/Dockerfile" - }, - { - "name": "entrypoint", - "path": "template/entrypoint" - }, - { - "name": "kool.ini", - "path": "template/kool-ini" - }, - { - "name": "zz-docker.conf", - "path": "template/zz-docker-conf" - } - ] - }, - { - "name": "8.1-nginx", - "data": { - "from": "kooldev/php:8.1", - "prod": false, - "nginx": true, - "version": "8.1" - }, - "files": [ - { - "name": "Dockerfile", - "path": "template/Dockerfile-nginx" - }, - { - "name": "entrypoint", - "path": "template/entrypoint" - }, - { - "name": "default.tmpl", - "path": "template/default-tmpl" - }, - { - "name": "supervisor.conf", - "path": "template/supervisor-conf" - } - ] - }, - { - "name": "8.1-nginx-prod", - "data": { - "from": "kooldev/php:8.1-prod", - "prod": true, - "nginx": true, - "version": "8.1" - }, - "files": [ - { - "name": "Dockerfile", - "path": "template/Dockerfile-nginx" - }, - { - "name": "entrypoint", - "path": "template/entrypoint" - }, - { - "name": "default.tmpl", - "path": "template/default-tmpl" - }, - { - "name": "supervisor.conf", - "path": "template/supervisor-conf" - } - ] - }, - { - "name": "8.1-node", - "data": { - "from": "kooldev/php:8.1", - "version": "8.1" - }, - "files": [ - { - "name": "Dockerfile", - "path": "template/Dockerfile-node" - } - ] - }, { "name": "8.2", "data": { diff --git a/kool.yml b/kool.yml index a82c675..f55cbb4 100644 --- a/kool.yml +++ b/kool.yml @@ -1,17 +1,5 @@ scripts: template: kool docker fireworkweb/fwd:v1.0 fwd template - build-8.0: - - docker build --pull -t kooldev/php:8.0 8.0 - - docker build --pull -t kooldev/php:8.0-prod 8.0-prod - - docker build -t kooldev/php:8.0-nginx 8.0-nginx - - docker build -t kooldev/php:8.0-nginx-prod 8.0-nginx-prod - - docker build -t kooldev/php:8.0-node 8.0-node - build-8.1: - - docker build -t kooldev/php:8.1 8.1 - - docker build -t kooldev/php:8.1-prod 8.1-prod - - docker build -t kooldev/php:8.1-nginx 8.1-nginx - - docker build -t kooldev/php:8.1-nginx-prod 8.1-nginx-prod - - docker build -t kooldev/php:8.1-node 8.1-node build-8.2: - docker build -t kooldev/php:8.2 8.2 - docker build -t kooldev/php:8.2-prod 8.2-prod @@ -50,8 +38,6 @@ scripts: # parse templates - kool run template # build - - kool run build-8.0 - - kool run build-8.1 - kool run build-8.2 - kool run build-8.3 - kool run build-8.4 diff --git a/scripts/test-image.sh b/scripts/test-image.sh new file mode 100644 index 0000000..aca9c1e --- /dev/null +++ b/scripts/test-image.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +set -euo pipefail + +tag=${1:?Usage: test-image.sh TAG} +image="kooldev/php:$tag" + +run() { + docker run --rm "$image" "$@" +} + +run php -v +run composer -V +run composer1 -V +for command in php composer composer1; do + docker run --rm -e ASUSER=1000 "$image" "$command" --version +done +test "$(docker run --rm -e ASUSER=1000 "$image" id -u)" = 1000 + +run dockerize --version +run sh -c 'echo "{{ .Env.TEST_VAR }}" > /tmp/test.tmpl; TEST_VAR=hello dockerize -template /tmp/test.tmpl:/tmp/test.out; test "$(cat /tmp/test.out)" = hello' + +# Read the module list once, and match whole names (e.g. zip, not gzip). +modules=$(run php -m) +for extension in readline bcmath gd intl pdo_mysql pdo_pgsql redis zip mbstring ldap; do + grep -Fxi "$extension" <<< "$modules" +done + +xdebug_modules=$(docker run --rm -e ENABLE_XDEBUG=true "$image" php -m) +if [[ "$tag" == *-prod ]]; then + grep -Fxi 'Zend OPcache' <<< "$modules" + if grep -Fxi xdebug <<< "$xdebug_modules"; then + echo "ERROR: xdebug must not be available in production" >&2 + exit 1 + fi +else + grep -Fxi pcov <<< "$modules" + grep -Fxi xdebug <<< "$xdebug_modules" + if grep -Fxi xdebug <<< "$modules"; then + echo "ERROR: xdebug must be disabled by default" >&2 + exit 1 + fi +fi + +if [[ "$tag" == *-debian* ]]; then + run gosu --version + run bash -c 'test -n "$BASH_VERSION"' +fi + +if [[ "$tag" == *-nginx* ]]; then + run nginx -v + run nginx -T + run supervisord --version +fi + +if [[ "$tag" == *-node ]]; then + run node -v + run npm -v + run yarn -v +fi