FROM dhi.io/node:24.20.0-debian13-dev LABEL maintainer="Penpot " ENV LANG=en_US.UTF-8 \ LC_ALL=en_US.UTF-8 \ DEBIAN_FRONTEND=noninteractive \ PATH=/opt/imagick/bin:$PATH \ PLAYWRIGHT_BROWSERS_PATH=/opt/penpot/browsers RUN set -ex; \ apt-get -qq update; \ apt-get -qqy --no-install-recommends install passwd; \ useradd -U -M -u 1001 -s /bin/false -d /opt/penpot penpot; \ apt-get -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade; \ apt-get -qqy --no-install-recommends install \ curl \ tzdata \ locales \ ca-certificates \ ; \ apt-get clean; \ rm -rf /var/lib/apt/lists/*; \ echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen; \ locale-gen; \ find /usr/share/i18n/locales/ -type f ! -name "en_US" ! -name "POSIX" ! -name "C" -delete; RUN set -ex; \ apt-get -qq update; \ apt-get -qqy install \ \ xvfb \ fonts-noto-color-emoji \ fonts-unifont \ libfontconfig1 \ libfreetype6 \ xfonts-cyrillic \ xfonts-scalable \ fonts-liberation \ fonts-ipafont-gothic \ fonts-wqy-zenhei \ fonts-tlwg-loma-otf \ fonts-freefont-ttf \ poppler-utils \ \ libasound2 \ libatk-bridge2.0-0 \ libatk1.0-0 \ libatspi2.0-0 \ libcairo2 \ libcups2 \ libdbus-1-3 \ libdrm2 \ libgbm1 \ libglib2.0-0 \ libnspr4 \ libnss3 \ libpango-1.0-0 \ libx11-6 \ libxcb1 \ libxcomposite1 \ libxdamage1 \ libxext6 \ libxfixes3 \ libxkbcommon0 \ libxrandr2 \ \ libgomp1 \ libheif1 \ libjpeg62-turbo \ liblcms2-2 \ libopenexr-3-1-30 \ libopenjp2-7 \ libpng16-16 \ librsvg2-2 \ libtiff6 \ libwebp7 \ libwebpdemux2 \ libwebpmux3 \ libxml2 \ libzip5 \ libzstd1 \ ; \ apt-get clean; \ rm -rf /var/lib/apt/lists/*; \ mkdir -p /opt/penpot; \ chown -R penpot:penpot /opt/penpot; ARG BUNDLE_PATH="./bundle-exporter/" COPY --chown=penpot:penpot $BUNDLE_PATH /opt/penpot/exporter/ COPY --from=penpotapp/imagemagick:7.1.2-27 /opt/imagick /opt/imagick WORKDIR /opt/penpot/exporter # pnpm ships as a system binary (same tarball + SHA pin as # docker/devenv/Dockerfile); the generated ./setup expects it on PATH. # Corepack is gone from Node 25+, so nothing here may use it. ARG PNPM_VERSION=12.5.1 RUN set -eux; \ ARCH="$(dpkg --print-architecture)"; \ case "${ARCH}" in \ aarch64|arm64) \ PNPM_ARCH='arm64'; \ PNPM_SHA256='84e1290e82c800acd406b6db27e9650e15db3c2344d12162cc305ea1f942c6ff'; \ ;; \ amd64|x86_64) \ PNPM_ARCH='x64'; \ PNPM_SHA256='5a397dfb6b3d4b07d3d7769586aeb471048faf04299a492e2808b95a9a1c701f'; \ ;; \ *) \ echo "Unsupported arch: ${ARCH}"; \ exit 1; \ ;; \ esac; \ curl -LfsSo /tmp/pnpm.tar.gz "https://github.com/pnpm/pnpm/releases/download/v${PNPM_VERSION}/pnpm-linux-${PNPM_ARCH}.tar.gz"; \ echo "${PNPM_SHA256} */tmp/pnpm.tar.gz" | sha256sum -c -; \ mkdir -p /usr/local/bin; \ tar -xzf /tmp/pnpm.tar.gz -C /usr/local/bin pnpm; \ chmod 755 /usr/local/bin/pnpm; \ rm -f /tmp/pnpm.tar.gz; \ pnpm --version; # `./setup` only needs pnpm on PATH (installed above as root). # Ownership is fixed right after. RUN ./setup && chown -R penpot:penpot /opt/penpot/exporter USER penpot:penpot CMD ["node", "app.js"]