|
|
@@ -0,0 +1,93 @@
|
|
|
+# syntax=docker/dockerfile:1
|
|
|
+
|
|
|
+# Builds omnisearch + libbeaker from upstream, then runs on a slim image.
|
|
|
+#
|
|
|
+# Notes:
|
|
|
+# - This repo is written in C and links against libbeaker (shared library).
|
|
|
+# - At runtime, libbeaker must be present in the dynamic linker path.
|
|
|
+# - The server binds to 0.0.0.0:8087 by default in example-config.ini.
|
|
|
+
|
|
|
+# --- build stage ---
|
|
|
+FROM debian:trixie AS build
|
|
|
+
|
|
|
+WORKDIR /src
|
|
|
+
|
|
|
+# Toolchain + headers for building omnisearch and beaker
|
|
|
+RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
|
+ ca-certificates \
|
|
|
+ git \
|
|
|
+ make \
|
|
|
+ gcc \
|
|
|
+ libc6-dev \
|
|
|
+ libcurl4-openssl-dev \
|
|
|
+ libxml2-dev \
|
|
|
+ libssl-dev \
|
|
|
+ && rm -rf /var/lib/apt/lists/*
|
|
|
+
|
|
|
+# Fetch and build/install beaker from upstream
|
|
|
+RUN git clone https://git.bwaaa.monster/beaker /tmp/beaker \
|
|
|
+ && make -C /tmp/beaker \
|
|
|
+ && make -C /tmp/beaker install \
|
|
|
+ && rm -rf /tmp/beaker
|
|
|
+
|
|
|
+# Copy omnisearch source
|
|
|
+COPY . .
|
|
|
+
|
|
|
+# Build omnisearch (produces bin/omnisearch)
|
|
|
+RUN make
|
|
|
+
|
|
|
+# --- runtime stage ---
|
|
|
+FROM debian:trixie-slim AS runtime
|
|
|
+
|
|
|
+WORKDIR /app
|
|
|
+
|
|
|
+# Runtime shared libs + TLS roots
|
|
|
+RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
|
+ ca-certificates \
|
|
|
+ libcurl4 \
|
|
|
+ libxml2 \
|
|
|
+ libssl3 \
|
|
|
+ && rm -rf /var/lib/apt/lists/*
|
|
|
+
|
|
|
+# Copy binary + assets
|
|
|
+COPY --from=build /src/bin/omnisearch /usr/local/bin/omnisearch
|
|
|
+COPY --from=build /src/templates /app/templates
|
|
|
+COPY --from=build /src/static /app/static
|
|
|
+COPY --from=build /src/example-config.ini /app/config.ini
|
|
|
+
|
|
|
+# Bundle libbeaker from build stage and register likely library directories with the dynamic loader.
|
|
|
+# Don't assume an exact SONAME/filename (it might be libbeaker.so.0, etc) or install location.
|
|
|
+COPY --from=build /usr/local/lib/libbeaker.so* /usr/local/lib/
|
|
|
+COPY --from=build /usr/lib/libbeaker.so* /usr/lib/
|
|
|
+COPY --from=build /usr/lib/*-linux-gnu/libbeaker.so* /usr/lib/
|
|
|
+RUN set -eux; \
|
|
|
+ echo "/usr/local/lib" > /etc/ld.so.conf.d/omnisearch.conf; \
|
|
|
+ echo "/usr/lib" >> /etc/ld.so.conf.d/omnisearch.conf; \
|
|
|
+ echo "/usr/lib/x86_64-linux-gnu" >> /etc/ld.so.conf.d/omnisearch.conf; \
|
|
|
+ echo "=== libbeaker debug listing ==="; \
|
|
|
+ (ls -la /usr/local/lib | grep -i beaker) || true; \
|
|
|
+ (ls -la /usr/lib | grep -i beaker) || true; \
|
|
|
+ (ls -la /usr/lib/x86_64-linux-gnu | grep -i beaker) || true; \
|
|
|
+ # Ensure an unversioned libbeaker.so exists somewhere in the loader path. \
|
|
|
+ # Some installs only provide versioned files (libbeaker.so.0 / libbeaker.so.0.0.0). \
|
|
|
+ if ! [ -e /usr/local/lib/libbeaker.so ] && ! [ -e /usr/lib/libbeaker.so ] && ! [ -e /usr/lib/x86_64-linux-gnu/libbeaker.so ]; then \
|
|
|
+ v="$({ ls -1 /usr/local/lib/libbeaker.so.* /usr/lib/libbeaker.so.* /usr/lib/x86_64-linux-gnu/libbeaker.so.* 2>/dev/null || true; } | head -n1)"; \
|
|
|
+ if [ -z "$v" ]; then \
|
|
|
+ echo "ERROR: libbeaker not found in runtime image after COPY. Check build-stage install location."; \
|
|
|
+ exit 1; \
|
|
|
+ fi; \
|
|
|
+ d="$(dirname "$v")"; \
|
|
|
+ ln -s "$(basename "$v")" "$d/libbeaker.so"; \
|
|
|
+ fi; \
|
|
|
+ ldconfig
|
|
|
+
|
|
|
+# Run as non-root
|
|
|
+RUN useradd --system --home /app --shell /usr/sbin/nologin appuser \
|
|
|
+ && chown -R appuser:appuser /app
|
|
|
+USER appuser
|
|
|
+
|
|
|
+EXPOSE 8087
|
|
|
+
|
|
|
+# Many setups read config.ini from the working directory.
|
|
|
+# If omnisearch uses an env var or CLI flag for config, adjust CMD accordingly.
|
|
|
+CMD ["omnisearch"]
|