# Shorashim Vav Pipeline — Elixir/OTP release with Sanhedrin # Construction spec §1.1: Elixir 1.16.1, OTP 26.2.1 # The pipeline and Sanhedrin run in the same BEAM VM. # # PLATFORM PIN: # Both FROM directives below pin `--platform=linux/amd64`. Exoscale # SKS nodes are amd64; without this pin, a build on an Apple Silicon # workstation would emit an arm64 image that the cluster cannot exec # (the kohen's Day 3 fails with "exec format error"). The pin makes # the build artifact self-correct regardless of build host. # Local multi-arch dev (linux/amd64,linux/arm64) is supported by # scripts/build_and_push.sh — see that script for the canonical build. # === BUILD STAGE === FROM --platform=linux/amd64 hexpm/elixir:1.16.1-erlang-26.2.1-ubuntu-jammy-20240125 AS build RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/* WORKDIR /app # Copy Sanhedrin (Erlang dep, referenced as path dep from vav_pipeline) COPY sanhedrin/ sanhedrin/ # Copy Vav Pipeline COPY vav_pipeline/ vav_pipeline/ WORKDIR /app/vav_pipeline # Fetch deps and compile in prod mode ENV MIX_ENV=prod RUN mix local.hex --force && \ mix local.rebar --force && \ mix deps.get --only prod && \ mix compile # Build OTP release RUN mix release # === RUNTIME STAGE === FROM --platform=linux/amd64 ubuntu:jammy-20240125 RUN apt-get update && \ apt-get install -y --no-install-recommends \ libstdc++6 openssl ca-certificates locales && \ rm -rf /var/lib/apt/lists/* && \ sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \ locale-gen ENV LANG=en_US.UTF-8 ENV LANGUAGE=en_US:en ENV LC_ALL=en_US.UTF-8 # Non-root user — the system serves, it does not own RUN useradd --create-home --shell /bin/bash shorashim USER shorashim WORKDIR /home/shorashim # Copy the release COPY --from=build --chown=shorashim:shorashim \ /app/vav_pipeline/_build/prod/rel/vav_pipeline ./app # L1 Torah filesystem — baked into the image (read-only, ~29MB) # The scroll is sealed in the aron. It ships with the vessel. COPY --chown=shorashim:shorashim l1/ /mnt/torah/ # L1 mount point ENV L1_MOUNT_POINT=/mnt/torah # Manna provision file location ENV MANNA_PROVISION_FILE=/var/lib/shorashim/manna/today.json # PostgreSQL connection for L3 # Set DATABASE_URL in production deployment # ENV DATABASE_URL= # Health check port EXPOSE 4000 CMD ["./app/bin/vav_pipeline", "start"]