# Multi-stage Dockerfile for {{APP_NAME}}, generated by `spry docker`. # # Expected build context layout (assembled by `spry docker --stack-dir`): # invercargill/ ← Web-Stack/Invercargill # invercargill-json/ ← Web-Stack/Invercargill-Json # astralis/ ← Web-Stack/astralis # invercargill-sql/ ← Web-Stack/Invercargill-Sql # invercargill-sql-inversion/ ← Web-Stack/Invercargill-Sql-Inversion # statum/ ← Web-Stack/Statum # spry/ ← Web-Stack/Spry # app/ ← this application # The Web-Stack trees carry fixes not present on their remotes, so every # stack library is COPYed from the local checkout instead of cloned. Only # inversion is not part of Web-Stack; it is cloned below, pinned to a # reviewed commit. # Base image pinned by digest (docker.io/library/fedora:43 at generation # time); refresh with `skopeo inspect docker://docker.io/library/fedora:43` # and update both FROM lines. FROM docker.io/library/fedora:43@sha256:a651ddf48ea28a06ed4e1e6519f51c9f47e7a5a138722ade87369b8fbb7e5b42 AS builder # Install build dependencies RUN dnf install -y \ meson \ ninja-build \ gcc \ vala \ glib2-devel \ gobject-introspection-devel \ json-glib-devel \ libxml2-devel \ zlib-devel \ libzstd-devel \ libgee-devel \ brotli-devel \ libmicrohttpd-devel \ libsodium-devel \ sqlite-devel \ git \ pkg-config \ && dnf clean all # --- invercargill (COPYed; meson project lives in src/) ------------------------ COPY invercargill /build/invercargill RUN meson setup invercargill/src invercargill/builddir --prefix=/usr && \ ninja -C invercargill/builddir && \ ninja -C invercargill/builddir install # --- invercargill-json (COPYed; meson project lives in src/) ------------------- COPY invercargill-json /build/invercargill-json RUN meson setup invercargill-json/src invercargill-json/builddir --prefix=/usr && \ ninja -C invercargill-json/builddir && \ ninja -C invercargill-json/builddir install # --- inversion (cloned; the one dependency outside Web-Stack) ------------------ # Pinned to a reviewed commit — bump it in lockstep with the local checkout # at ~/Projects/inversion when it changes. RUN git clone https://fabrica.unitatem.net/Tilo15/inversion.git inversion && \ cd inversion && \ git checkout fc350827451e2c95af4d8e86d3ab5386e1e1a756 && \ meson setup . builddir --prefix=/usr && \ ninja -C builddir && \ ninja -C builddir install # --- astralis (COPYed) ---------------------------------------------------------- COPY astralis /build/astralis RUN meson setup astralis astralis/builddir --prefix=/usr && \ ninja -C astralis/builddir && \ ninja -C astralis/builddir install # --- invercargill-sql (COPYed) -------------------------------------------------- COPY invercargill-sql /build/invercargill-sql RUN meson setup invercargill-sql invercargill-sql/builddir --prefix=/usr && \ ninja -C invercargill-sql/builddir && \ ninja -C invercargill-sql/builddir install # --- invercargill-sql-inversion (COPYed) ---------------------------------------- COPY invercargill-sql-inversion /build/invercargill-sql-inversion RUN meson setup invercargill-sql-inversion invercargill-sql-inversion/builddir --prefix=/usr && \ ninja -C invercargill-sql-inversion/builddir && \ ninja -C invercargill-sql-inversion/builddir install # --- statum (COPYed) ------------------------------------------------------------ COPY statum /build/statum RUN meson setup statum statum/builddir --prefix=/usr && \ ninja -C statum/builddir && \ ninja -C statum/builddir install # --- spry (COPYed) -------------------------------------------------------------- COPY spry /build/spry RUN meson setup spry spry/builddir --prefix=/usr && \ ninja -C spry/builddir && \ ninja -C spry/builddir install # --- The application ------------------------------------------------------------ # web-config.json is excluded from the context by .dockerignore — keys are # never baked into the image (mount the config at runtime; see README.md). COPY app /build/app RUN meson setup app app/builddir --prefix=/usr && \ ninja -C app/builddir && \ ninja -C app/builddir install # --- Runtime --------------------------------------------------------------------- # Same pinned base as the builder stage. FROM docker.io/library/fedora:43@sha256:a651ddf48ea28a06ed4e1e6519f51c9f47e7a5a138722ade87369b8fbb7e5b42 AS runtime # Install runtime dependencies only RUN dnf install -y \ glib2 \ json-glib \ libxml2 \ zlib \ libzstd \ brotli \ libmicrohttpd \ libgee \ libsodium \ sqlite \ && dnf clean all # Copy built libraries and the application binary from the builder COPY --from=builder /usr/lib64/libinvercargill*.so* /usr/lib64/ COPY --from=builder /usr/lib64/libinvercargill-json*.so* /usr/lib64/ COPY --from=builder /usr/lib64/libinversion*.so* /usr/lib64/ COPY --from=builder /usr/lib64/libastralis*.so* /usr/lib64/ COPY --from=builder /usr/lib64/libstatum*.so* /usr/lib64/ COPY --from=builder /usr/lib64/libspry*.so* /usr/lib64/ COPY --from=builder /usr/lib64/girepository-1.0/ /usr/lib64/girepository-1.0/ COPY --from=builder /usr/bin/{{APP_NAME}} /usr/bin/ # Persistent state lives outside /app: the SQLite store in a named volume, # configuration bind-mounted read-only at runtime (see README.md). ENV SPRY_DB_PATH=/var/lib/{{APP_NAME}}/{{APP_NAME}}.sqlite VOLUME /var/lib/{{APP_NAME}} WORKDIR /app RUN ldconfig # Expose the default port and run the application EXPOSE 8080 CMD ["{{APP_NAME}}", "8080"]