Dockerfile 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. # Multi-stage Dockerfile for {{APP_NAME}}, generated by `spry docker`.
  2. #
  3. # Expected build context layout (assembled by `spry docker --stack-dir`):
  4. # invercargill/ ← Web-Stack/Invercargill
  5. # invercargill-json/ ← Web-Stack/Invercargill-Json
  6. # astralis/ ← Web-Stack/astralis
  7. # invercargill-sql/ ← Web-Stack/Invercargill-Sql
  8. # invercargill-sql-inversion/ ← Web-Stack/Invercargill-Sql-Inversion
  9. # statum/ ← Web-Stack/Statum
  10. # spry/ ← Web-Stack/Spry
  11. # app/ ← this application
  12. # The Web-Stack trees carry fixes not present on their remotes, so every
  13. # stack library is COPYed from the local checkout instead of cloned. Only
  14. # inversion is not part of Web-Stack; it is cloned below, pinned to a
  15. # reviewed commit.
  16. # Base image pinned by digest (docker.io/library/fedora:43 at generation
  17. # time); refresh with `skopeo inspect docker://docker.io/library/fedora:43`
  18. # and update both FROM lines.
  19. FROM docker.io/library/fedora:43@sha256:a651ddf48ea28a06ed4e1e6519f51c9f47e7a5a138722ade87369b8fbb7e5b42 AS builder
  20. # Install build dependencies
  21. RUN dnf install -y \
  22. meson \
  23. ninja-build \
  24. gcc \
  25. vala \
  26. glib2-devel \
  27. gobject-introspection-devel \
  28. json-glib-devel \
  29. libxml2-devel \
  30. zlib-devel \
  31. libzstd-devel \
  32. libgee-devel \
  33. brotli-devel \
  34. libmicrohttpd-devel \
  35. libsodium-devel \
  36. sqlite-devel \
  37. git \
  38. pkg-config \
  39. && dnf clean all
  40. # --- invercargill (COPYed; meson project lives in src/) ------------------------
  41. COPY invercargill /build/invercargill
  42. RUN meson setup invercargill/src invercargill/builddir --prefix=/usr && \
  43. ninja -C invercargill/builddir && \
  44. ninja -C invercargill/builddir install
  45. # --- invercargill-json (COPYed; meson project lives in src/) -------------------
  46. COPY invercargill-json /build/invercargill-json
  47. RUN meson setup invercargill-json/src invercargill-json/builddir --prefix=/usr && \
  48. ninja -C invercargill-json/builddir && \
  49. ninja -C invercargill-json/builddir install
  50. # --- inversion (cloned; the one dependency outside Web-Stack) ------------------
  51. # Pinned to a reviewed commit — bump it in lockstep with the local checkout
  52. # at ~/Projects/inversion when it changes.
  53. RUN git clone https://fabrica.unitatem.net/Tilo15/inversion.git inversion && \
  54. cd inversion && \
  55. git checkout fc350827451e2c95af4d8e86d3ab5386e1e1a756 && \
  56. meson setup . builddir --prefix=/usr && \
  57. ninja -C builddir && \
  58. ninja -C builddir install
  59. # --- astralis (COPYed) ----------------------------------------------------------
  60. COPY astralis /build/astralis
  61. RUN meson setup astralis astralis/builddir --prefix=/usr && \
  62. ninja -C astralis/builddir && \
  63. ninja -C astralis/builddir install
  64. # --- invercargill-sql (COPYed) --------------------------------------------------
  65. COPY invercargill-sql /build/invercargill-sql
  66. RUN meson setup invercargill-sql invercargill-sql/builddir --prefix=/usr && \
  67. ninja -C invercargill-sql/builddir && \
  68. ninja -C invercargill-sql/builddir install
  69. # --- invercargill-sql-inversion (COPYed) ----------------------------------------
  70. COPY invercargill-sql-inversion /build/invercargill-sql-inversion
  71. RUN meson setup invercargill-sql-inversion invercargill-sql-inversion/builddir --prefix=/usr && \
  72. ninja -C invercargill-sql-inversion/builddir && \
  73. ninja -C invercargill-sql-inversion/builddir install
  74. # --- statum (COPYed) ------------------------------------------------------------
  75. COPY statum /build/statum
  76. RUN meson setup statum statum/builddir --prefix=/usr && \
  77. ninja -C statum/builddir && \
  78. ninja -C statum/builddir install
  79. # --- spry (COPYed) --------------------------------------------------------------
  80. COPY spry /build/spry
  81. RUN meson setup spry spry/builddir --prefix=/usr && \
  82. ninja -C spry/builddir && \
  83. ninja -C spry/builddir install
  84. # --- The application ------------------------------------------------------------
  85. # web-config.json is excluded from the context by .dockerignore — keys are
  86. # never baked into the image (mount the config at runtime; see README.md).
  87. COPY app /build/app
  88. RUN meson setup app app/builddir --prefix=/usr && \
  89. ninja -C app/builddir && \
  90. ninja -C app/builddir install
  91. # --- Runtime ---------------------------------------------------------------------
  92. # Same pinned base as the builder stage.
  93. FROM docker.io/library/fedora:43@sha256:a651ddf48ea28a06ed4e1e6519f51c9f47e7a5a138722ade87369b8fbb7e5b42 AS runtime
  94. # Install runtime dependencies only
  95. RUN dnf install -y \
  96. glib2 \
  97. json-glib \
  98. libxml2 \
  99. zlib \
  100. libzstd \
  101. brotli \
  102. libmicrohttpd \
  103. libgee \
  104. libsodium \
  105. sqlite \
  106. && dnf clean all
  107. # Copy built libraries and the application binary from the builder
  108. COPY --from=builder /usr/lib64/libinvercargill*.so* /usr/lib64/
  109. COPY --from=builder /usr/lib64/libinvercargill-json*.so* /usr/lib64/
  110. COPY --from=builder /usr/lib64/libinversion*.so* /usr/lib64/
  111. COPY --from=builder /usr/lib64/libastralis*.so* /usr/lib64/
  112. COPY --from=builder /usr/lib64/libstatum*.so* /usr/lib64/
  113. COPY --from=builder /usr/lib64/libspry*.so* /usr/lib64/
  114. COPY --from=builder /usr/lib64/girepository-1.0/ /usr/lib64/girepository-1.0/
  115. COPY --from=builder /usr/bin/{{APP_NAME}} /usr/bin/
  116. # Persistent state lives outside /app: the SQLite store in a named volume,
  117. # configuration bind-mounted read-only at runtime (see README.md).
  118. ENV SPRY_DB_PATH=/var/lib/{{APP_NAME}}/{{APP_NAME}}.sqlite
  119. VOLUME /var/lib/{{APP_NAME}}
  120. WORKDIR /app
  121. RUN ldconfig
  122. # Expose the default port and run the application
  123. EXPOSE 8080
  124. CMD ["{{APP_NAME}}", "8080"]