crawl4ai version
0.9.2
Expected Behavior
The published arm64 Docker image should only contain files needed at runtime. Build/test artifacts (crash dumps from the crawl4ai-doctor sanity check) and intermediate install artifacts (the root-owned Playwright browser cache, superseded by the copy made for appuser) should be cleaned up before the image layers are committed.
Current Behavior
unclecode/crawl4ai:latest (arm64) reports as 9.06GB via docker images. Inspecting a freshly-pulled container shows two separate sources of dead weight, totaling ~2.4GB of its ~5.5GB live filesystem:
- Core dumps in /app (~926MB)
-r--r--r-- root root 510M /app/qemu_headless_shell_20260715-085214_28.core
-r--r--r-- root root 208M /app/qemu_headless_shell_20260715-085211_34.core
-r--r--r-- root root 208M /app/qemu_headless_shell_20260715-085211_32.core
- These are dated at image build time, not container runtime, and are root-owned/read-only, so end users can't remove them from a running container.
- Duplicate Chromium install (~1.5GB)
1.5G /root/.cache/ms-playwright (dead - root never runs; container runs as appuser)
958M /home/appuser/.cache/ms-playwright (actually used at runtime)
playwright install --with-deps installs the browser to /root/.cache (running as root during build), then a later RUN step cp -r's it to /home/appuser/.cache for the actual runtime user, but never deletes the original. Both copies ship in the final image.
Is this reproducible?
Yes
Inputs Causing the Bug
N/A — not input-dependent. Present in every pull of the arm64 image, not triggered by user config.
Steps to Reproduce
Steps to Reproduce:
1. docker pull unclecode/crawl4ai:latest
2. docker run --rm -it unclecode/crawl4ai:latest bash
3. ls -lh /app/*.core
4. du -sh /root/.cache/ms-playwright /home/appuser/.cache/ms-playwright
Code snippets
docker history — confirms duplicate layer cost:
$ docker history --no-trunc unclecode/crawl4ai:latest | grep -E "chown -R root|cp -r.*ms-playwright"
972MB RUN chown -R root:root ${APP_HOME} && chmod -R a-w ${APP_HOME}
1GB RUN mkdir -p /home/appuser/.cache/ms-playwright \
&& cp -r /root/.cache/ms-playwright/chromium-* \
/root/.cache/ms-playwright/chromium_headless_shell-* \
/home/appuser/.cache/ms-playwright/ \
&& chown -R appuser:appuser /home/appuser/.cache/ms-playwright
docker-release.yml — confirms cross-arch QEMU build:
$ grep -A3 "platforms:" .github/workflows/docker-release.yml
platforms: linux/amd64,linux/arm64
cache-from: type=gha
cache-to: type=gha,mode=max
OS
Linux (Raspberry Pi OS, arm64
Python version
3.12
Browser
Chromium (bundled headless_shell, via Playwright build 1228)
Browser version
149.0.7827.0
Error logs & Screenshots (if applicable)
docker history shows the chown -R root:root $APP_HOME && chmod -R a-w $APP_HOME layer at 972MB, matching the ~926MB of .core files in /app. du -sh on a running container shows /root/.cache/ms-playwright (1.5G) and /home/appuser/.cache/ms-playwright (958M) as separate, duplicate browser installs
crawl4ai version
0.9.2
Expected Behavior
The published arm64 Docker image should only contain files needed at runtime. Build/test artifacts (crash dumps from the crawl4ai-doctor sanity check) and intermediate install artifacts (the root-owned Playwright browser cache, superseded by the copy made for appuser) should be cleaned up before the image layers are committed.
Current Behavior
unclecode/crawl4ai:latest(arm64) reports as 9.06GB via docker images. Inspecting a freshly-pulled container shows two separate sources of dead weight, totaling ~2.4GB of its ~5.5GB live filesystem:1.5G /root/.cache/ms-playwright (dead - root never runs; container runs as appuser) 958M /home/appuser/.cache/ms-playwright (actually used at runtime)playwright install --with-depsinstalls the browser to/root/.cache(running as root during build), then a laterRUN step cp -r's it to/home/appuser/.cachefor the actual runtime user, but never deletes the original. Both copies ship in the final image.Is this reproducible?
Yes
Inputs Causing the Bug
N/A — not input-dependent. Present in every pull of the arm64 image, not triggered by user config.Steps to Reproduce
Steps to Reproduce: 1. docker pull unclecode/crawl4ai:latest 2. docker run --rm -it unclecode/crawl4ai:latest bash 3. ls -lh /app/*.core 4. du -sh /root/.cache/ms-playwright /home/appuser/.cache/ms-playwrightCode snippets
OS
Linux (Raspberry Pi OS, arm64
Python version
3.12
Browser
Chromium (bundled headless_shell, via Playwright build 1228)
Browser version
149.0.7827.0
Error logs & Screenshots (if applicable)
docker history shows the
chown -R root:root $APP_HOME && chmod -R a-w $APP_HOMElayer at 972MB, matching the ~926MB of .core files in /app.du -shon a running container shows/root/.cache/ms-playwright(1.5G) and/home/appuser/.cache/ms-playwright(958M) as separate, duplicate browser installs