# syntax=docker/dockerfile:1 # Supply digests from plane/task-base.digest; deliberately no floating fallback. ARG TASK_BASE_TAG=base-unpublished ARG TASK_BASE_DIGEST ARG ENGINE_REF=engine FROM ghcr.io/norandom/ousast-task-base:${TASK_BASE_TAG}@${TASK_BASE_DIGEST} AS joern-build ENV PATH="/opt/joern-cli:${PATH}" ARG JOERN_VERSION=v4.0.625 ARG ARCHIVE=joern-cli-linux-x86_64.zip RUN apt-get update \ && apt-get install -y --no-install-recommends curl unzip \ && rm -rf /var/lib/apt/lists/* RUN set -eux; \ cd /tmp; \ curl -fsSL -O "https://github.com/joernio/joern/releases/download/${JOERN_VERSION}/${ARCHIVE}"; \ curl -fsSL -O "https://github.com/joernio/joern/releases/download/${JOERN_VERSION}/${ARCHIVE}.sha512"; \ sed 's@ target/@ @' "${ARCHIVE}.sha512" > checksum.sha512; \ sha512sum -c checksum.sha512; \ unzip -q "${ARCHIVE}" -d /opt; \ rm -f "${ARCHIVE}" "${ARCHIVE}.sha512" checksum.sha512; \ /opt/joern-cli/joern-parse --help > /dev/null RUN if [ ! -e /opt/joern-cli/jssrc2cpg ] && [ -x /opt/joern-cli/jssrc2cpg.sh ]; then \ ln -s jssrc2cpg.sh /opt/joern-cli/jssrc2cpg; \ fi COPY ops/frontend-retention/install.py /tmp/frontend-retention-install.py RUN python3 /tmp/frontend-retention-install.py /opt/joern-cli \ && rm /tmp/frontend-retention-install.py FROM ghcr.io/norandom/ousast-task-base:${TASK_BASE_TAG}@${TASK_BASE_DIGEST} AS engine ENV PATH="/opt/joern-cli:${PATH}" COPY --from=joern-build /opt/joern-cli /opt/joern-cli WORKDIR /app COPY pyproject.toml README.md LICENSE ./ COPY src ./src RUN --mount=type=cache,target=/root/.cache/pip \ /venv/bin/pip install --no-deps --no-cache-dir . COPY benchmarks/learn/engine_task_entry.py \ benchmarks/learn/engine_trace_worker.py \ benchmarks/learn/engine_trace_parse.py ./benchmarks/learn/ RUN /venv/bin/python -I -c 'import pathlib, runpy, sys; sys.modules.update(yaml=None, boto3=None); sys.path.insert(0, "/app/benchmarks/learn"); p = pathlib.Path("/app/benchmarks/learn/engine_trace_worker.py"); print("Worker import smoke bytes:", len(p.read_bytes())); runpy.run_path(str(p), run_name="engine_worker_import_smoke")' # ENTRYPOINT and CMD belong to the upstream AX runner. FROM ${ENGINE_REF} AS replay COPY benchmarks/unseen/replay_entry.py ./benchmarks/unseen/replay_entry.py RUN /venv/bin/ousast pre-push --help > /dev/null