Static asset magnification for the Website service (#20)
This PR contains the work done for build-time optimization of the static assets served by the Website service. The production Docker image now ships minified JS/CSS and losslessly recompressed images, while the sources in the repository stay readable and un-minified. Reviewed-on: rock-n-code/loud-amsterdam#20 Co-authored-by: Javier Cicchelli <javier@rock-n-code.com> Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
This commit is contained in:
@@ -1,3 +1,27 @@
|
||||
# ================================
|
||||
# Asset image
|
||||
# ================================
|
||||
FROM node:22-alpine AS assets
|
||||
|
||||
# Install the minifiers in their own layer, so they are cached across asset changes
|
||||
RUN apk add --no-cache oxipng \
|
||||
&& npm install --global esbuild svgo
|
||||
|
||||
# Copy the static files and minify the JS/CSS/SVG sources and losslessly recompress
|
||||
# the PNG images in place, keeping their names so the URL paths derived from the
|
||||
# StaticFile enumeration stay unchanged.
|
||||
WORKDIR /static
|
||||
COPY ./Services/Website/Resources/Static .
|
||||
RUN esbuild --minify --allow-overwrite --outdir=css css/*.css \
|
||||
&& esbuild --minify --allow-overwrite --outdir=js js/*.js \
|
||||
&& oxipng --opt max --strip safe *.png \
|
||||
&& svgo icon.svg
|
||||
|
||||
# Export stage: `docker build --target assets-export --output <dir>` writes the
|
||||
# minified static files to <dir> for local inspection.
|
||||
FROM scratch AS assets-export
|
||||
COPY --from=assets /static /
|
||||
|
||||
# ================================
|
||||
# Build image
|
||||
# ================================
|
||||
@@ -45,8 +69,13 @@ RUN cp "/usr/libexec/swift/linux/swift-backtrace-static" ./
|
||||
RUN find -L "$(swift build --package-path /build/Services/Website -c release --show-bin-path)/" -regex '.*\.resources$' -exec cp -Ra {} ./ \;
|
||||
|
||||
# Copy the static files directory (served by FileMiddleware) if it exists
|
||||
RUN [ -d /build/Services/Website/Resources ] && mv /build/Services/Website/Resources ./Resources || true
|
||||
|
||||
# Overwrite the static files with the minified copies from the assets stage
|
||||
COPY --from=assets /static ./Resources/Static
|
||||
|
||||
# Ensure that by default, neither the directory nor any of its contents are writable.
|
||||
RUN [ -d /build/Services/Website/Resources ] && { mv /build/Services/Website/Resources ./Resources && chmod -R a-w ./Resources; } || true
|
||||
RUN chmod -R a-w ./Resources
|
||||
|
||||
# ================================
|
||||
# Run image
|
||||
|
||||
Reference in New Issue
Block a user