| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- # 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"]
|