FROM node:22-bookworm-slim ARG HYPERFRAMES_VERSION=latest RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates curl unzip ffmpeg chromium \ libgbm1 libnss3 libatk-bridge2.0-0 libdrm2 libxcomposite1 \ libxdamage1 libxrandr2 libcups2 libasound2 libpangocairo-1.0-0 \ libxshmfence1 libgtk-3-0 \ fonts-liberation fonts-noto-color-emoji fonts-noto-cjk fonts-noto-core \ fonts-noto-extra fonts-noto-ui-core fonts-freefont-ttf fonts-dejavu-core \ fontconfig \ && rm -rf /var/lib/apt/lists/* && apt-get clean && fc-cache -fv ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium ENV CONTAINER=true RUN npx --yes @puppeteer/browsers install chrome-headless-shell@stable \ --path /root/.cache/puppeteer RUN npm install -g hyperframes@${HYPERFRAMES_VERSION} # Wrapper script: resolves chrome-headless-shell path at build time, # sets PRODUCER_HEADLESS_SHELL_PATH at runtime so the engine uses # BeginFrame rendering instead of falling back to system Chromium. RUN SHELL_PATH=$(find /root/.cache/puppeteer/chrome-headless-shell -name "chrome-headless-shell" -type f | head -1) \ && printf '#!/bin/sh\nexport PRODUCER_HEADLESS_SHELL_PATH=%s\nexec hyperframes render "$@"\n' "$SHELL_PATH" > /usr/local/bin/hf-render \ && chmod +x /usr/local/bin/hf-render WORKDIR /project ENTRYPOINT ["hf-render"]