77# docker build --build-arg BUILD_ENV=copy .
88ARG BUILD_ENV=git
99
10- # NOTE: this intentionally lags the "packageManager" pin in package.json. pnpm
11- # 11.1.x enforces the minimum-release-age supply-chain policy during install,
12- # which the frozen-lockfile Docker build can't satisfy , so the image stays on
13- # 11.0.x. The version gap is made harmless by pnpm_config_pm_on_fail=ignore in
14- # the build stage below — see ether/etherpad#7911.
15- ARG PnpmVersion=11.0.6
10+ # NOTE: this tracks the "packageManager" pin in package.json. pnpm's
11+ # minimum-release-age supply-chain policy (enforced during install) is satisfied
12+ # by the `minimumReleaseAgeExclude` list in pnpm-workspace.yaml , so the image no
13+ # longer needs to lag the pin the way it did during the pnpm 11.1.x era — see
14+ # ether/etherpad#7911.
15+ ARG PnpmVersion=12.4.2
1616
1717FROM node:24-alpine AS adminbuild
1818# Install pnpm directly via npm (rather than via corepack) so the same
@@ -33,15 +33,13 @@ RUN pnpm run build:ui
3333FROM node:24-alpine AS build
3434LABEL maintainer="Etherpad team, https://github.com/ether/etherpad"
3535
36- # The image's pnpm intentionally lags the "packageManager" pin (see the ARG
37- # note above). pnpm would otherwise try to self-provision the pinned version on
38- # invocation — including the informational `pnpm --version` probe Etherpad runs
39- # at startup — which fails closed with no network and breaks air-gapped boots
40- # (ether/etherpad#7911). pm_on_fail=ignore makes pnpm use the installed version
41- # instead. Inherited by the development and production runtime stages, so it
42- # also covers the updater's pnpm-on-PATH check and ad-hoc `pnpm` in an exec
43- # shell. It does not change which pnpm runs the build-time install (still the
44- # installed 11.0.x), so the frozen-lockfile build is unaffected.
36+ # The image's pnpm matches the "packageManager" pin (see the ARG note above),
37+ # so pnpm does not self-provision on invocation. pm_on_fail=ignore is kept as
38+ # belt-and-suspenders: if the pin and the image ever drift again, pnpm falls
39+ # back to the installed version instead of downloading the pinned build — which
40+ # fails closed with no network and breaks air-gapped boots (ether/etherpad#7911).
41+ # Inherited by the development and production runtime stages, so it also covers
42+ # the updater's pnpm-on-PATH check and ad-hoc `pnpm` in an exec shell.
4543ENV pnpm_config_pm_on_fail=ignore
4644
4745# Set these arguments when building the image from behind a proxy
@@ -202,7 +200,7 @@ ENV ETHERPAD_PRODUCTION=true
202200# needed at runtime. Overwrite it with a production-only version so
203201# pnpm install doesn't warn about missing workspace directories.
204202# Preserve the build-script policy from the source workspace file so
205- # pnpm 11 doesn't error out with ERR_PNPM_IGNORED_BUILDS for transitive
203+ # pnpm doesn't error out with ERR_PNPM_IGNORED_BUILDS for transitive
206204# postinstalls (e.g. @scarf/scarf via swagger-ui-dist).
207205RUN printf 'packages:\n - src\n - bin\n onlyBuiltDependencies:\n - esbuild\n ignoredBuiltDependencies:\n - "@scarf/scarf"\n strictDepBuilds: false\n ' > pnpm-workspace.yaml
208206
@@ -239,7 +237,7 @@ HEALTHCHECK --interval=5s --timeout=3s \
239237 CMD wget -qO- http://127.0.0.1:9001/health | grep -E "pass|ok|up" > /dev/null || exit 1
240238
241239EXPOSE 9001
242- # Run node directly instead of via `pnpm run prod`. pnpm 11 's
240+ # Run node directly instead of via `pnpm run prod`. pnpm's
243241# `runDepsStatusCheck` fires before every `pnpm run …` and spuriously
244242# decides node_modules is out of sync on first start under the named-
245243# volume layout used by docker-compose (mounting src/plugin_packages).
0 commit comments