45 lines
2.1 KiB
Docker
45 lines
2.1 KiB
Docker
# syntax=docker/dockerfile:1
|
||
# SolidCraft in the browser as a container: the static site (the one packaging/web/package.sh
|
||
# zips) served by nginx on port 8080, as an unprivileged user. From the repository root:
|
||
#
|
||
# docker build -f packaging/docker/Dockerfile -t solidcraft-web .
|
||
# docker run --rm -p 8080:8080 solidcraft-web then open http://localhost:8080/
|
||
#
|
||
# Or `docker compose up` with packaging/docker/compose.yaml. Saving designs needs HTTPS or
|
||
# localhost (the browser's private file storage), so put a TLS reverse proxy in front of it on a
|
||
# server; the site works under any URL path.
|
||
#
|
||
# The site is wasm, the same on every platform, so it is built once on the build machine's own
|
||
# platform even for a multi-platform image. CI builds it outside Docker (with its Rust cache and
|
||
# git commit for Help › About) and passes it in as the `site` stage: --build-context site=dist/web.
|
||
|
||
ARG RUST_VERSION=1.95
|
||
ARG TRUNK_VERSION=0.21.14
|
||
|
||
FROM --platform=$BUILDPLATFORM rust:${RUST_VERSION}-slim-bookworm AS build
|
||
ARG TRUNK_VERSION
|
||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||
RUN apt-get update \
|
||
&& apt-get install -y --no-install-recommends ca-certificates curl \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
RUN rustup target add wasm32-unknown-unknown \
|
||
&& curl -fsSL "https://github.com/trunk-rs/trunk/releases/download/v${TRUNK_VERSION}/trunk-$(uname -m)-unknown-linux-gnu.tar.gz" \
|
||
| tar -xz -C /usr/local/bin trunk
|
||
WORKDIR /src
|
||
COPY . .
|
||
WORKDIR /src/apps/solidcraft-web
|
||
# Trunk downloads the wasm-bindgen and wasm-opt its build needs; its post-build hook writes sw.js.
|
||
RUN --mount=type=cache,target=/usr/local/cargo/registry \
|
||
--mount=type=cache,target=/src/target \
|
||
trunk build --release
|
||
|
||
FROM scratch AS site
|
||
COPY --from=build /src/dist/web/ /
|
||
|
||
FROM nginxinc/nginx-unprivileged:1.29-alpine
|
||
COPY packaging/docker/nginx.conf /etc/nginx/conf.d/default.conf
|
||
COPY LICENSE-MIT LICENSE-APACHE NOTICE THIRD-PARTY-LICENSES.txt /usr/share/doc/solidcraft/
|
||
COPY --from=site / /srv/solidcraft/
|
||
EXPOSE 8080
|
||
HEALTHCHECK --interval=30s --timeout=5s CMD wget -q --spider http://127.0.0.1:8080/ || exit 1
|