无头 Chrome 截图任务跑到一半报 Target closed,日志里有 Failed to allocate shared memory。容器里 df -h /dev/shm 显示 64M。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
df -h /dev/shm docker run --rm --shm-size=1g chrome:120 --headless --screenshot=/tmp/a.png https://example.com
/dev/shm 默认按容器内存的一小部分给,Docker 上固定 64MB 很常见。Chrome 渲染进程靠共享内存传帧,空间不够就整个崩掉。这一点先确认清楚,后面就不用反复试。
「dev shm 太小」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,先量一下任务需要多大的共享内存 别直接给到和内存一样大;docker run 加 --shm-size 或者 compose 里写 shm_size;K8s 用 emptyDir 加 medium: Memory 挂到 /dev/shm;改完连续跑几十次截图 看还会不会崩。
改完照着核一遍,df 显示 1.0G,截图任务连续跑二十次不再崩。
