@@ -9,14 +9,16 @@ FROM {{ getenv "BASE_IMAGE" }} AS runtime
99
1010ARG DEBIAN_FRONTEND= noninteractive
1111
12+ ENV LANG= C.UTF -8
13+
1214ARG XDG_CONFIG_HOME= /config
13- ENV XDG_CONFIG_HOME= $XDG_CONFIG_HOME
15+ ENV XDG_CONFIG_HOME= " $XDG_CONFIG_HOME"
1416
1517ARG XDG_DATA_HOME= /data
16- ENV XDG_DATA_HOME= $XDG_DATA_HOME
18+ ENV XDG_DATA_HOME= " $XDG_DATA_HOME"
1719
1820ARG XDG_CACHE_HOME= /cache
19- ENV XDG_CACHE_HOME= $XDG_CACHE_HOME
21+ ENV XDG_CACHE_HOME= " $XDG_CACHE_HOME"
2022
2123# Latest version of event-extension: https://pecl.php.net /package/event
2224ARG PHP_EVENT_VERSION= 3.1.6
@@ -27,14 +29,12 @@ ARG PHP_REDIS_VERSION=6.3.0
2729# Latest version of amqp-extension: https://pecl.php.net /package/amqp
2830ARG PHP_AMQP_VERSION= 2.2.0
2931
30- ARG DEBIAN_SECURITY_SNAPSHOT= 20260901T000000Z
31-
3232WORKDIR /var/www
3333
3434RUN --mount= type= bind,from= php_extension_installer,source= /usr/bin/install-php-extensions,target= /usr/local/bin/install-php-extensions \
3535 # Bullseye is EOL:
36- sed -i -E " s|^deb http://deb.debian.org/debian-security (.*)|deb [check-valid-until=no] http://snapshot .debian.org/archive/ debian-security/$DEBIAN_SECURITY_SNAPSHOT \1|" /etc/apt/sources.list \
37- && grep -q snapshot .debian.org /etc/apt/sources.list \
36+ sed -i -E " s|^deb http://deb.debian.org/debian-security (.*)|deb http://archive .debian.org/debian-security \1|" /etc/apt/sources.list \
37+ && grep -q archive .debian.org /etc/apt/sources.list \
3838 && apt-get update \
3939 && apt-get install --assume-yes --no-install-recommends \
4040 apt-transport-https \
@@ -58,9 +58,9 @@ RUN --mount=type=bind,from=php_extension_installer,source=/usr/bin/install-php-e
5858 " amqp-$PHP_AMQP_VERSION" \
5959 && cp " $PHP_INI_DIR/php.ini-production" " $PHP_INI_DIR/php.ini" \
6060 && mkdir -p \
61- $XDG_CONFIG_HOME \
62- $XDG_DATA_HOME \
63- $XDG_CACHE_HOME \
61+ " $XDG_CONFIG_HOME" \
62+ " $XDG_DATA_HOME" \
63+ " $XDG_CACHE_HOME" \
6464 && rm -rf /var/www/* \
6565 # Cleanup
6666 && apt-get autoremove --assume-yes \
@@ -73,6 +73,9 @@ COPY files/general /
7373# Latest version of Composer: https://hub.docker.com/r/composer/composer/tags
7474FROM {{ getenv "COMPOSER_IMAGE" }} AS composer
7575
76+ # Latest version of node: https://hub.docker.com/_/node/tags
77+ FROM {{ getenv "NODE_IMAGE" }} AS node
78+
7679FROM runtime AS builder
7780
7881ARG TARGETARCH
@@ -83,6 +86,16 @@ ARG XDEBUG_VERSION=3.1.6
8386# Latest version of pcov: https://pecl.php.net/package/pcov
8487ARG PCOV_VERSION=1.0.12
8588
89+ # Latest version of fixuid: https://github.com/boxboat/fixuid/releases/latest
90+ ARG FIXUID_VERSION=0.6.0
91+
92+ ARG USER=code
93+ ARG GROUP=code
94+ ARG USER_UID=1000
95+ ARG USER_GID=1000
96+
97+ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
98+
8699RUN --mount=type=bind,from=php_extension_installer,source=/usr/bin/install-php-extensions,target=/usr/local/bin/install-php-extensions \
87100 apt-get update \
88101 && apt-get install --assume-yes --no-install-recommends \
@@ -93,6 +106,9 @@ RUN --mount=type=bind,from=php_extension_installer,source=/usr/bin/install-php-e
93106 p7zip-full \
94107 unzip \
95108 curl \
109+ gcc \
110+ g++ \
111+ make \
96112 # Download Composer keys
97113 && mkdir -p "$XDG_CONFIG_HOME/composer" \
98114 && curl -fsSLo "$XDG_CONFIG_HOME/composer/keys.dev.pub" https://composer.github.io/snapshots.pub \
@@ -103,23 +119,8 @@ RUN --mount=type=bind,from=php_extension_installer,source=/usr/bin/install-php-e
103119 "xdebug-$XDEBUG_VERSION" \
104120 "pcov-$PCOV_VERSION" \
105121 && cp "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini" \
106- # Cleanup
107- && apt-get autoremove --assume-yes \
108- && apt-get clean --assume-yes \
109- && rm -rf /var/lib/apt/lists/* \
110- && rm -rf /tmp/*
111-
112- # Latest version of fixuid: https://github.com/boxboat/fixuid/releases/latest
113- ARG FIXUID_VERSION=0.6.0
114-
115- ARG USER=code
116- ARG GROUP=code
117- ARG USER_UID=1000
118- ARG USER_GID=1000
119-
120- SHELL ["/bin/bash", "-o", "pipefail", "-c"]
121-
122- RUN curl -fsSLo /tmp/fixuid.tar.gz "https://github.com/boxboat/fixuid/releases/download/v$FIXUID_VERSION/fixuid-${FIXUID_VERSION}-linux-${TARGETARCH}.tar.gz" \
122+ # Install fixuid
123+ && curl -fsSLo /tmp/fixuid.tar.gz "https://github.com/boxboat/fixuid/releases/download/v$FIXUID_VERSION/fixuid-${FIXUID_VERSION}-linux-${TARGETARCH}.tar.gz" \
123124 && tar -xf /tmp/fixuid.tar.gz -C /usr/local/bin fixuid \
124125 && chown root:root /usr/local/bin/fixuid \
125126 && chmod 4755 /usr/local/bin/fixuid \
@@ -133,51 +134,53 @@ RUN curl -fsSLo /tmp/fixuid.tar.gz "https://github.com/boxboat/fixuid/releases/d
133134 && useradd --uid "$USER_UID" --gid "$USER_GID" --create-home "$USER" --shell /bin/bash \
134135 && mkdir -p \
135136 /etc/fixuid \
136- "/data" \
137- "/config" \
138- "/cache/npm" \
139- "/cache/node" \
137+ "$XDG_CACHE_HOME/npm" \
138+ "$XDG_CACHE_HOME/node" \
139+ "$XDG_CACHE_HOME/yarn" \
140+ "$XDG_DATA_HOME/pnpm/store" \
141+ "$XDG_DATA_HOME/yarn/berry" \
140142 && chown -R "$USER_UID":"$USER_GID" \
141- "/data" \
142- "/config" \
143- "/cache" \
143+ "$XDG_DATA_HOME" \
144+ "$XDG_CONFIG_HOME" \
145+ "$XDG_CACHE_HOME" \
146+ # Cleanup
147+ && apt-get autoremove --assume-yes \
148+ && apt-get clean --assume-yes \
149+ && rm -rf /var/lib/apt/lists/* \
150+ && rm -rf /tmp/* \
144151 && cat <<EOF > /etc/fixuid/config.yml
145152user: $USER
146153group: $existing_group
147154paths:
148155 - /var/www
149- - /home/$USER
150- - /data
151- - /config
152- - /cache
156+ - " /home/$USER"
157+ - "$XDG_DATA_HOME"
158+ - "$XDG_CONFIG_HOME"
159+ - "$XDG_CACHE_HOME"
153160
154161EOF
155162
156- COPY --from=composer /composer /usr/bin/composer
157-
158- # Latest version of node: https://hub.docker.com/_/node/tags
159- FROM {{ getenv "NODE_IMAGE" }} AS node
160-
161- FROM builder AS builder_nodejs
162-
163- ARG DEBIAN_FRONTEND=noninteractive
164-
165163ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0
166164ENV npm_config_cache="$XDG_CACHE_HOME/npm"
165+ ENV PNPM_CONFIG_STORE_DIR="$XDG_DATA_HOME/pnpm/store"
167166
168167COPY --from=node /usr/local/bin/node /usr/local/bin/node
169168COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules
170169
171- RUN apt-get update \
172- && apt-get install --assume-yes --no-install-recommends \
173- gcc \
174- g++ \
175- make \
176- && ln -s ../lib/node_modules/corepack/dist/corepack.js /usr/local/bin/corepack \
177- && corepack install --global npm@11.x yarn@4.x pnpm@10.x \
170+ # Latest version of corepack: https://www.npmjs.com/package/corepack
171+ ARG COREPACK_VERSION=0.36.0
172+
173+ # Node.js 25+ no longer bundles corepack. npm's bin links are not copied from the node stage, and its cache goes to /tmp
174+ # so no root-owned files end up in npm_config_cache.
175+ RUN node /usr/local/lib/node_modules/npm/bin/npm-cli.js install --global \
176+ --cache /tmp/npm-cache --no-update-notifier --no-audit --no-fund \
177+ "corepack@$COREPACK_VERSION" \
178+ && corepack install --global npm@12.x yarn@4.x pnpm@12.x \
178179 && corepack enable npm yarn pnpm \
180+ # pnpm downloads its platform-specific binary on first run
181+ && pnpm --version \
182+ && chown -R --reference="$XDG_CACHE_HOME" "$XDG_CACHE_HOME/node" \
179183 # Cleanup
180- && apt-get autoremove --assume-yes \
181- && apt-get clean --assume-yes \
182- && rm -rf /var/lib/apt/lists/* \
183184 && rm -rf /tmp/*
185+
186+ COPY --from=composer /composer /usr/local/bin/composer
0 commit comments