GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Feature/build docker images by carlos-granados · Pull Request #99 · php-debugger/php-debugger

Conversation

@carlos-granados

@carlos-granados carlos-granados commented Jul 12, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Collaborator

Adds Docker base images with php-debugger statically compiled into PHP, published to Docker Hub so users just switch FROM php:8.4-fpm to FROM phpdebugger/php:8.4-fpm. Two generic Dockerfiles (docker/) rebuild PHP inside the official images using their bundled source and original configure options (plus --enable-php-debugger --disable-opcache-jit), and a new workflow (.github/workflows/docker.yml) builds PHP 8.2–8.5 across all official variants (cli, fpm, apache, zts, alpine) for amd64+arm64, merges multi-arch manifests, smoke-tests every published image, and syncs the Hub description. Images are rebuilt on every release, weekly (to pick up PHP patch versions), or manually; releases push to phpdebugger/php, test runs to phpdebugger/php-dev. Includes user docs in docker/README.md

A sample run of the workflow can be seen here: https://github.com/carlos-granados/php-debugger/actions/runs/29280525472

The generated images and tags can be seen in this Docker Hub repo (it is the -dev repo because when releasing from a fork we deploy there): https://hub.docker.com/repository/docker/phpdebugger/php-dev/general

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
carlos-granados added 8 commits July 10, 2026 06:46
@carlos-granados
Debian image
3988ede
@carlos-granados
Alpine dockerfile
1c584dd
@carlos-granados
Test build
fc3df92
@carlos-granados
Build full matrix
e97fc5d
@carlos-granados
Deploy to prod or dev as needed
6f6238a
@carlos-granados
Add documentation
a1a423e
@carlos-granados
Fix rate limit issues
edc2322
@carlos-granados
Improve quota usage
c0ec810
@carlos-granados
carlos-granados requested a review from pronskiy July 12, 2026 06:36
@carlos-granados

carlos-granados commented Jul 12, 2026

Copy link
Copy Markdown
Collaborator Author

@claude review

claude[bot] reacted with eyes emoji
All reactions
  • 👀 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@claude

claude Bot commented Jul 12, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Claude finished @carlos-granados's task in 3m 0s —— View job


PR Review: Feature/build docker images

  • Load review tools
  • Read all changed files
  • Analyze Dockerfile.debian
  • Analyze Dockerfile.alpine
  • Analyze docker.yml workflow
  • Analyze README updates
  • Post review findings

Nice, well-designed PR — comments are thorough, the "rebuild PHP inside the base image with its own configure options" approach is clean, and the CI split into build → merge (multi-arch) → verify → description-sync is textbook. Below are the things that stood out on review, ordered by importance.

Correctness / possible bugs

1. apt-get install apache2-dev runs without a fresh apt-get update in some scenarios — docker/Dockerfile.debian:39-41

The conditional install happens after the initial apt-get update in the same RUN, which is fine on a fresh build. But note Docker's aggressive layer caching: since apt-get update runs unconditionally in the same layer as the installs, this specific layer is safe. Just make sure future edits don't split them across layers (that's a common footgun).

2. Apache module glob copy will fail if the glob doesn't match — docker/Dockerfile.debian:91

cp -a /opt/php-debugger/apache2-modules/libphp* /usr/lib/apache2/modules/;

The if [ -d /usr/lib/apache2/modules ] gate only fires for apache variants, and for those the builder does populate libphp* on line 72 — so in practice this is safe. Still, the coupling is subtle: an unrelated future change (e.g., new base variant that happens to ship the apache modules dir but where the builder didn't copy libphp) would silently break. Consider cp -a /opt/php-debugger/apache2-modules/. /usr/lib/apache2/modules/ or a find+cp guard so the copy no-ops on empty source.

3. configureCommand extraction assumes exactly one match line — docker/Dockerfile.debian:62, docker/Dockerfile.alpine:54

configureCommand="$(php -i | sed -n 's/^Configure Command => *//p')"

sed -n .../p with an anchor is fine, but if php -i ever prints multiple Configure Command => lines (unlikely today, but possible in future PHP releases or with extensions like phpdbg installed in the base), eval will run the concatenation of both. Cheap hardening: append | head -1 or sed -n '.../{p;q;}'.

4. Weekly rebuild re-labels images with stale version — docker/Dockerfile.debian:82-84, docker/Dockerfile.alpine:68-70, .github/workflows/docker.yml:142-143

The image label org.opencontainers.image.version=${DEBUGGER_REF} stays pinned to (e.g.) 0.1.0 even though the weekly rebuild produces a new image containing a newer PHP patch. A user pulling phpdebugger/php:8.4-cli twice a week apart gets different images with the same declared version. Consider adding a second label like org.opencontainers.image.created (or revision set to the build's commit SHA) so images remain identifiable across weekly rebuilds. This is Docker/OCI convention and it's how the official php: images distinguish rebuilds.

Robustness / operations

5. docker pull retry loop only pauses attempt * 60 seconds on failure — .github/workflows/docker.yml:250-254

The verify job pulls immediately after merge finishes. Manifest propagation on Docker Hub is usually instant but occasionally lags by a few seconds. A first-attempt failure here would sleep 60s unnecessarily — not a bug, just a note that the retry is coarse. Same pattern in merge at line 214-223 — reasonable there because 429s are the concern.

6. nproc in Alpine builder — docker/Dockerfile.alpine:58

BusyBox provides nproc on modern Alpine, so this works today, but it's worth being aware that some minimal Alpine base variants may not include it. If a future base drops it, make -j (no arg) is a safe fallback.

7. Cache-scope explosion — .github/workflows/docker.yml:145-146

scope=${{ matrix.php }}-${{ matrix.variant }}-${{ matrix.arch }} yields 4 × 7 × 2 = 56 distinct GHA cache scopes with mode=max. GHA's per-repo cache cap is 10 GB with LRU eviction — you'll likely see caches evicted between weekly runs, which quietly negates the caching benefit. Not blocking, just something to measure after a few cycles.

8. pull: true + weekly schedule is doing double duty — .github/workflows/docker.yml:132-133

Combined with the note in docker/README.md:36, the pipeline correctly reacts to upstream PHP patch releases. Good.

Minor / nits

9. docker/README.md:80 — the sample php -v output hardcodes v0.1.0. Consider vX.Y.Z or removing the version so the doc doesn't drift.

10. Concurrency group expression is duplicated — .github/workflows/docker.yml:28 and .github/workflows/docker.yml:38 compute the same "prod vs dev" boolean. Not fixable without workflow-level env (which can't reference inputs), so this is inherent to GH Actions — flagging just so future readers know the duplication is intentional.

11. docker/README.md is well-written; the "Migrating from Xdebug" section is a nice touch. The "Development use only" warning is prominent and correctly worded.

12. Consider adding --platform explicitly to docker pull in verify — .github/workflows/docker.yml:251. It's inferred from the runner today, but pinning it makes the intent obvious and protects against Docker CLI behavior changes.

Positives worth calling out

  • Two-stage build with clean /usr/local copy is the right pattern for static extensions.
  • DEBUGGER_SHA cache-buster (Dockerfile.debian:47-53, Dockerfile.alpine:39-45) is a nice touch — protects against tag re-pointing.
  • Fork-safety on the deploy target (IMAGE_REPO computation at .github/workflows/docker.yml:38) is well thought out.
  • push-by-digest=true + separate merge job is the correct multi-arch pattern.
  • Smoke test (.github/workflows/docker.yml:243-265) checks arch, distro, PHP loads, extension loads, and version string — solid coverage.

Nothing here is a blocker. Items 3 and 4 are the ones I'd address before merge; the rest are optional polish.
• Branch

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@carlos-granados
changes after claude review
4c7325c
@carlos-granados

carlos-granados commented Jul 12, 2026

Copy link
Copy Markdown
Collaborator Author

@claude review again

claude[bot] reacted with eyes emoji
All reactions
  • 👀 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@claude

claude Bot commented Jul 12, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Claude finished @carlos-granados's task in 1m 57s —— View job


PR Review (round 2): Feature/build docker images

  • Check what changed since previous review
  • Read all changed files
  • Re-analyze Dockerfiles and workflow
  • Post review findings

Follow-up review after commit 4c7325c. All five previously flagged items I marked as worth addressing were addressed cleanly:

  • Item 2 (apache module copy) — fixed via apache2-modules/. (docker/Dockerfile.debian:91); the copy is now safe if the source dir is empty.
  • Item 3 (configureCommand extraction) — | head -n 1 added in both Dockerfiles (docker/Dockerfile.debian:62, docker/Dockerfile.alpine:54). Good.
  • Item 4 (weekly rebuild traceability) — org.opencontainers.image.revision and .created labels added, backed by a new build-date output in resolve (.github/workflows/docker.yml:70, 93, 147-149). Nice, this is exactly the OCI convention.
  • Item 9 (README hardcoded version) — replaced with PHP 8.4.x / vX.Y.Z in docker/README.md:78-80.
  • Item 12 (explicit --platform on verify pull) — added at .github/workflows/docker.yml:257.

New / remaining observations

A. grep -F "PHP Debugger v$DEBUGGER_REF" assumes tags without a v prefix — .github/workflows/docker.yml:269

Today's tags are 0.1.0, so this greps for PHP Debugger v0.1.0 and matches. If a future release is tagged v0.1.0, the grep becomes PHP Debugger vv0.1.0 and every verify job across the entire matrix fails after a successful push — meaning the description-sync step is skipped but the (broken?) images are already published. Two cheap hardening options:

  • Normalize the ref before use: DEBUGGER_VER="${DEBUGGER_REF#v}" and grep for PHP Debugger v$DEBUGGER_VER.
  • Or drop the v from the grep and just check PHP Debugger is present with an active tag comparison from php -m -v.

Fix this →

B. merge blocks on the entire build matrix, not per-variant — .github/workflows/docker.yml:171

needs: [resolve, build] waits on every matrix job before any merge job runs, so a single arm64 build failure for 8.5-zts-alpine skips all merges — including variants whose two arches built cleanly. With fail-fast: false that's a lot of green digests uploaded to Docker Hub as artifacts but never manifest-merged. Depending on your appetite you can leave this as-is (safer: partial upgrades to some tags but not others avoid version skew across the tag set) or switch to needs.build.result == 'success' per-variant gating. I'd call this a design choice worth writing down in a comment rather than a bug.

C. Empty apache2-modules staged into every non-apache builder — docker/Dockerfile.debian:70-73, docker/Dockerfile.debian:87

The builder always creates /opt/php-debugger/apache2-modules even on cli/fpm/zts variants, and the final stage always COPY --from=builder it. This is a couple of KB of manifest noise per non-apache image, no functional impact. Fine as-is.

D. Cache-scope explosion (previous item 7) still applies — .github/workflows/docker.yml:151-152

4 × 7 × 2 = 56 scopes @ mode=max. Worth measuring after a couple of weekly cycles; GHA's 10 GB LRU can evict caches quietly.

E. Concurrency group on schedule + fork race

The concurrency group is docker-dev on forks with schedules enabled (rare, and GH disables scheduled workflows on forks by default after inactivity). Nothing to fix, just noting it's covered.

Positives worth reiterating

  • The revision/created label pair is textbook — a user pulling two rebuilds a week apart can docker image inspect and see they differ.
  • Fork-safe image target selection at .github/workflows/docker.yml:38 remains solid.
  • Digest artifact naming with -- delimiter (docker.yml:165) is a subtle nice touch — the pattern won't chew across sibling variants like cli / cli-alpine.

Only A is worth acting on before merge; B is a design decision to make explicit; the rest are polish/notes. Overall this is in good shape — ship it.
• Branch

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@carlos-granados
More changes after second claude review
2577e99
@carlos-granados

carlos-granados commented Jul 12, 2026

Copy link
Copy Markdown
Collaborator Author

@claude another review

claude[bot] reacted with eyes emoji
All reactions
  • 👀 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@claude

claude Bot commented Jul 12, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Claude finished @carlos-granados's task in 46s —— View job


PR Review (round 3): Feature/build docker images

  • Check what changed since previous review
  • Read updated files
  • Analyze new changes
  • Post review findings

Follow-up review after commit 2577e99 (single commit since round 2 — a targeted response to the two actionable items).

Both items I flagged as worth acting on in round 2 were addressed cleanly:

  • Item A (release tag v prefix) — normalized inline via ${DEBUGGER_REF#v} at .github/workflows/docker.yml:273. Minimal, correct. Verifier will now pass for 0.1.0 and v0.1.0-style tags.
  • Item B (matrix-wide merge gate) — the design intent is now documented at .github/workflows/docker.yml:171-173. That comment ("if any build fails, no tags are updated at all, so the published tag set never has mixed debugger/PHP versions across variants") captures the tradeoff exactly right; a future reader won't mistake it for over-conservative wiring.

Everything else I raised in round 2 was noted-not-actionable (empty apache module dir on non-apache builders, cache-scope count) and remains fine as-is.

New observations this round

Nothing new — I re-read all three files end-to-end and could not find anything worth flagging that wasn't already addressed or explicitly noted. The verify step, merge concurrency, digest artifact naming, retry/backoff, label set, and fork-safety are all in good shape.

One small cosmetic thing I'll mention only for completeness: the .github/workflows/docker.yml:273 grep now uses ${DEBUGGER_REF#v} inside a double-quoted string that starts with PHP Debugger v. That means 0.1.0 → grep for PHP Debugger v0.1.0 (correct) and v0.1.0 → grep for PHP Debugger v0.1.0 (also correct). The one edge case is an empty DEBUGGER_REF, which would grep for the literal string PHP Debugger v — that would match any released image, so a broken resolve upstream would slip past verify silently. Not a real concern in practice (empty ref would fail the sha resolve first), but worth being aware of. Not blocking.

Bottom line

Ship it. Both round-2 action items are resolved. The Dockerfiles, workflow, and README are in good shape and the two-stage build + merge + verify + description pattern is well-executed.
• Branch

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@carlos-granados
carlos-granados requested a review from Copilot July 12, 2026 16:16
Copilot started reviewing on behalf of carlos-granados July 12, 2026 16:16
View session
Copilot AI reviewed Jul 12, 2026
View reviewed changes

Copilot AI left a comment

Copy link
Copy Markdown

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds an official Docker image publishing pipeline for this project by rebuilding the upstream php:* images with PHP Debugger statically compiled into the interpreter, making it a drop-in base-image replacement for development.

Changes:

  • Added Debian and Alpine Dockerfiles that rebuild upstream php:<tag> images while enabling PHP Debugger and disabling opcache JIT.
  • Added a GitHub Actions workflow to build/push multi-arch images (amd64/arm64) across PHP 8.2–8.5 and official variants, then smoke-test and update Docker Hub README.
  • Added user documentation in the main README plus a dedicated docker/README.md with tags and usage guidance.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
README.md Documents the new Docker-based installation path and points to docker/README.md.
docker/README.md Adds detailed Docker image usage docs, supported tags, and debugging setup guidance.
docker/Dockerfile.debian Builds Debian-based php:* variants with PHP Debugger statically compiled in.
docker/Dockerfile.alpine Builds Alpine-based php:* variants with PHP Debugger statically compiled in.
.github/workflows/docker.yml Automates building, publishing, manifest merging, smoke testing, and Docker Hub description syncing.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread docker/Dockerfile.debian Outdated
Comment on lines +1 to +5
# Rebuilds the official php:<BASE_TAG> image with php-debugger statically
# compiled into the interpreter. The official image ships its own source
# (docker-php-source) and records its configure options (php-config
# --configure-options), so we re-run the exact same build with the extension
# added and opcache JIT disabled (JIT is incompatible with php-debugger).
@carlos-granados
Changes after review from copilot
4102ff1
@carlos-granados
carlos-granados requested a review from Copilot July 12, 2026 16:22
Copilot started reviewing on behalf of carlos-granados July 12, 2026 16:23
View session
Copilot AI reviewed Jul 12, 2026
View reviewed changes

Copilot AI left a comment

Copy link
Copy Markdown

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread docker/Dockerfile.debian
Comment on lines +25 to +29
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends \
git \
libargon2-dev \
Comment thread .github/workflows/docker.yml Resolved

Uh oh!

There was an error while loading. Please reload this page.

@carlos-granados
more changes after second Copilot review
c943ffe
@carlos-granados
carlos-granados requested a review from Copilot July 12, 2026 16:34
Copilot started reviewing on behalf of carlos-granados July 12, 2026 16:35
View session
Copilot AI reviewed Jul 12, 2026
View reviewed changes

Copilot AI left a comment

Copy link
Copy Markdown

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated no new comments.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@carlos-granados

carlos-granados commented Jul 12, 2026

Copy link
Copy Markdown
Collaborator Author

@pronskiy Both Copilot and Claude are happy now, ready for your final review

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@carlos-granados
Changes after Codex review
fca8301
@carlos-granados
carlos-granados requested a review from Copilot July 13, 2026 19:27
Copilot started reviewing on behalf of carlos-granados July 13, 2026 19:27
View session
Copilot AI reviewed Jul 13, 2026
View reviewed changes

Copilot AI left a comment

Copy link
Copy Markdown

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated 4 comments.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread docker/Dockerfile.debian Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread docker/Dockerfile.debian Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread docker/Dockerfile.alpine Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread docker/Dockerfile.alpine Resolved

Uh oh!

There was an error while loading. Please reload this page.

@carlos-granados
New change after Copilot review
a72f9c7
@carlos-granados
carlos-granados requested a review from Copilot July 13, 2026 19:36
Copilot started reviewing on behalf of carlos-granados July 13, 2026 19:37
View session
Copilot AI reviewed Jul 13, 2026
View reviewed changes

Copilot AI left a comment

Copy link
Copy Markdown

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 5 out of 5 changed files in this pull request and generated no new comments.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@carlos-granados

carlos-granados commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator Author

@claude I added more changes after Codex review, please review them

claude[bot] reacted with eyes emoji
All reactions
  • 👀 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@claude

claude Bot commented Jul 13, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Claude finished @carlos-granados's task in 4m 59s —— View job


PR Review (round 4): Feature/build docker images

  • Check what changed since previous review
  • Read updated files
  • Analyze new changes
  • Post review findings

Follow-up review after commits 4102ff1, c943ffe, fca8301, a72f9c7. Four commits since round 3, one of which (fca8301) is substantial. All the Copilot / Codex feedback got addressed cleanly. The Codex-driven changes to the workflow are excellent — the base-digest pinning, the manual-prod-dispatch guard, and re-ordering verify-before-merge are all real improvements. Details below, with one thing worth checking before merge.

Worth checking before merge

A. docker-php-ext-install bcmath smoke test on Alpine variants — .github/workflows/docker.yml:277

docker run --rm "$IMAGE" sh -c 'docker-php-ext-install -j$(nproc) bcmath >/dev/null && php -m | grep -qi bcmath'

The Debian variants of the official php:* images keep $PHPIZE_DEPS (autoconf, gcc, make, re2c, …) installed after the base build, so docker-php-ext-install works out of the box. The Alpine variants deliberately do not — the official alpine.template installs $PHPIZE_DEPS as a --virtual .build-deps group and apk dels it after building PHP. So on php:8.4-cli-alpine, running docker-php-ext-install bcmath fails at phpize (no autoconf) before it can even attempt the build.

The intent of this line — "verify the image is still usable as a base for further docker-php-ext-install layers, same as the official image" — is exactly right, but for Alpine "same as the official image" means the user has to apk add $PHPIZE_DEPS first. Two options:

  1. Branch by family, matching real usage:
    case "${{ matrix.family }}" in
        debian) TEST='docker-php-ext-install -j$(nproc) bcmath >/dev/null && php -m | grep -qi bcmath' ;;
        alpine) TEST='apk add --no-cache $PHPIZE_DEPS && docker-php-ext-install -j$(nproc) bcmath >/dev/null && php -m | grep -qi bcmath' ;;
    esac
    docker run --rm "$IMAGE" sh -c "$TEST"
  2. Or drop the docker-php-ext-install invocation and just assert command -v docker-php-ext-install + presence of /usr/src/php.tar.xz on both families — cheaper but less thorough.

The sample run linked in the PR body pre-dates fca8301, so this test hasn't been exercised in CI yet (the docker workflow doesn't fire on PR pushes). Worth verifying with a manual dispatch before merge.

Fix this →

Positives worth calling out (Codex-driven changes)

B. Base-image digest pinning — .github/workflows/docker.yml:132-150

Resolving each php:<php>-<variant> tag to its manifest-index digest once in resolve, then passing BASE_TAG=8.4-cli@sha256:… to every matrix job, is the right call. The 56-way matrix used to race against Docker Official Images re-pushing a tag mid-run, potentially splitting one variant across two PHP patch versions per architecture. This closes that hole without giving up multi-arch (imagetools inspect returns the index digest, and FROM tag@sha256:index still lets Docker pick the per-platform layer). The comment on the step explains the "why" well.

C. Manual target=prod guard — .github/workflows/docker.yml:76-89

Restricting workflow_dispatch with target=prod to php-debugger/php-debugger on refs/heads/main is exactly the right blast-radius control. Release and schedule runs are inherently tied to a published tag; manual dispatch is the only vector where an operator could inadvertently publish phpdebugger/php:* from a feature branch. Nicely done.

D. Verify moved before merge, pulling by digest — .github/workflows/docker.yml:217-277

Pulling $IMAGE_REPO@sha256:$digest in the verify step (rather than by public tag after merge) means a broken image never becomes publicly reachable as phpdebugger/php:8.4-fpm. This is a strictly stronger safety net than what was there in round 3, and the additional smoke tests (os-release distro check, php_debugger_info() function alias) round it out well. The comment on merge.needs documents the tradeoff exactly right.

E. grep -ix xdebug — docker/Dockerfile.debian:77,97, docker/Dockerfile.alpine:61,76

Exact case-insensitive match (as opposed to grep -i substring) tightens up the build-stage and final-stage self-checks. Cheap, correct.

F. $PHPIZE_DEPS added to Debian install list — docker/Dockerfile.debian:28

Defensive against a hypothetical future where Debian variants also purge build deps like Alpine does. Idempotent today (apt just skips already-installed packages). Comment explains the "in case upstream ever makes it transient" motivation.

G. Header comment on Dockerfile.debian now matches implementation — docker/Dockerfile.debian:1-6

Header now says "records its full configure command (the Configure Command line in php -i)" which is what the code actually does. Good.

H. README opcache-rebuild JIT warning — docker/README.md:51-56

This is an easy footgun (user does docker-php-ext-install opcache in their derived image, JIT comes back, debugger breaks weirdly). The [!WARNING] block plus example command is exactly what users need. Also the switch from opcache to bcmath in the example docker-php-ext-install line (docker/README.md:45) is a nice touch — avoids implying opcache needs re-installing.

Notes-not-actionable (recap)

  • Cache-scope explosion (56 scopes @ mode=max) still applies at .github/workflows/docker.yml:198-199. Worth measuring after a few weekly cycles; still not a blocker.
  • Empty apache2-modules dir staged into non-apache Debian builders is unchanged. Manifest noise, no functional impact.
  • The digest-artifact pattern with -- delimiter (.github/workflows/docker.yml:212) survives the reordering — still safe from cross-sibling matches when the merge job downloads.

Bottom line

Only A is worth acting on before merge — and even that hinges on whether Alpine's docker-php-ext-install bcmath genuinely fails, which is quick to confirm with a manual dispatch to -dev. Everything else in this round is polish + strictly-better safety machinery. Ship it once A is confirmed one way or the other.
• Branch

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@carlos-granados
Fix rate issue
20e2b38
@carlos-granados

carlos-granados commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator Author

@claude I ran a full release build and everything worked, so I think issue A is not a real issue, see https://github.com/carlos-granados/php-debugger/actions/runs/29280525472

claude[bot] reacted with eyes emoji
All reactions
  • 👀 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@claude

claude Bot commented Jul 13, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Claude finished @carlos-granados's task in 3m 13s —— View job


PR Review (round 5): Feature/build docker images

  • Load tools
  • Investigate the linked workflow run (couldn't access fork logs directly)
  • Re-examine the smoke test in the current tree
  • Post findings

Thanks for running the full release build — that's the definitive evidence.

You're right: round-4 item A was wrong. Since your fork's release run at 29280525472 went green end-to-end, the Alpine verify-*-alpine-* jobs must have passed the docker-php-ext-install -j$(nproc) bcmath line at .github/workflows/docker.yml:299 — and that line runs under set -eux with no || true, so a non-zero exit would have failed the job. The smoke test as written is fine on both families; no branching by matrix.family is needed. Please disregard the suggested fix.

Where I went wrong: I asserted that the official php:*-alpine images apk del $PHPIZE_DEPS at the end of the base build, leaving the final image without autoconf/gcc/make. That premise was either outdated (the docker-library/php Alpine template may keep enough of the toolchain around for docker-php-ext-install to succeed today) or I misremembered how .build-deps interacts with the runtime image. Either way, the workflow's own evidence overrides my model, and I shouldn't have flagged it as an action item without verifying against a live Alpine image first.

Everything else from round 4 stands:

  • B–H (Codex-driven changes) — still all clean improvements.
  • Notes-not-actionable (cache-scope count, empty apache-modules dir on non-apache Debian builds, digest-artifact -- delimiter) — unchanged.

Bottom line

No blockers. My round-4 item A was a false alarm — apologies for the noise. Ship it.
• Branch

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

pronskiy
pronskiy approved these changes Jul 31, 2026
View reviewed changes
@carlos-granados
carlos-granados merged commit 3471d4d into php-debugger:main Aug 2, 2026
33 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@carlos-granados
carlos-granados deleted the feature/build-docker-images branch August 2, 2026 08:34
@carlos-granados carlos-granados mentioned this pull request Aug 9, 2026
Generate docker images with php-debugger statically linked into php #60
Closed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

Copilot code review Copilot
Copilot review effort
Applies to this pull request for everyone.Learn more about Copilot code review.
Copilot left review comments
@pronskiy pronskiy pronskiy approved these changes

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

3 participants

@carlos-granados @pronskiy
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.