Files
SkillCompiler/scripts/evaluate/docker/opencode-runtime.Dockerfile
T
2026-09-04 14:58:42 +08:00

92 lines
3.2 KiB
Docker

ARG TASK_IMAGE=ubuntu:24.04
FROM ${TASK_IMAGE}
ARG NODE_VERSION=22.20.0
ARG OPENCODE_VERSION=1.18.16
ARG RUNTIME_BUILD_REVISION=2
ARG RUNTIME_SOURCE_FINGERPRINT=unknown
# OpenCode's Skill, glob, and grep tools use ripgrep. Install it in the
# reusable image so an evaluation never has to download rg from GitHub at
# agent runtime.
RUN set -eux; \
if command -v rg >/dev/null 2>&1; then \
:; \
elif command -v apt-get >/dev/null 2>&1; then \
apt-get update; \
apt-get install -y --no-install-recommends ripgrep; \
rm -rf /var/lib/apt/lists/*; \
elif command -v dnf >/dev/null 2>&1; then \
dnf -y install ripgrep; \
dnf clean all; \
elif command -v apk >/dev/null 2>&1; then \
apk add --no-cache ripgrep; \
else \
echo 'OpenCode runtime requires a package manager to install ripgrep' >&2; \
exit 127; \
fi; \
rg --version
RUN set -eux; \
if [ -x /opt/benchflow/node/bin/node ]; then \
/opt/benchflow/node/bin/node --version; \
else \
if ! command -v curl >/dev/null 2>&1 || ! command -v tar >/dev/null 2>&1; then \
if command -v apt-get >/dev/null 2>&1; then \
apt-get update; \
apt-get install -y --no-install-recommends curl ca-certificates tar; \
rm -rf /var/lib/apt/lists/*; \
elif command -v dnf >/dev/null 2>&1; then \
dnf -y install curl ca-certificates tar; \
dnf clean all; \
elif command -v apk >/dev/null 2>&1; then \
apk add --no-cache curl ca-certificates tar; \
else \
echo 'Node/OpenCode bootstrap requires curl and tar' >&2; \
exit 127; \
fi; \
fi; \
arch="$(uname -m)"; \
case "$arch" in \
x86_64|amd64) node_arch=x64 ;; \
aarch64|arm64) node_arch=arm64 ;; \
*) echo "Unsupported architecture for Node.js: $arch" >&2; exit 1 ;; \
esac; \
temporary_dir="$(mktemp -d)"; \
curl -fL \
--retry 8 --retry-delay 2 \
--connect-timeout 20 --max-time 900 \
-o "$temporary_dir/node.tar.gz" \
"https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.gz"; \
mkdir -p /opt/benchflow/node /opt/benchflow/js-agents /opt/benchflow/bin; \
tar -xzf "$temporary_dir/node.tar.gz" \
-C /opt/benchflow/node --strip-components=1 --no-same-owner; \
rm -rf "$temporary_dir"; \
fi
ENV PATH="/opt/benchflow/bin:/opt/benchflow/js-agents/bin:/opt/benchflow/node/bin:${PATH}"
RUN set -eux; \
if [ ! -x /opt/benchflow/js-agents/bin/opencode ]; then \
npm install -g \
--fetch-retries=8 \
--fetch-retry-factor=2 \
--fetch-retry-mintimeout=2000 \
--fetch-retry-maxtimeout=60000 \
--prefix /opt/benchflow/js-agents \
"opencode-ai@${OPENCODE_VERSION}"; \
fi; \
npm cache clean --force; \
rm -rf /root/.npm; \
printf '%s\n' \
'#!/bin/sh' \
'exec /opt/benchflow/js-agents/bin/opencode "$@"' \
> /opt/benchflow/bin/opencode; \
chmod +x /opt/benchflow/bin/opencode; \
chmod -R a+rX /opt/benchflow
LABEL org.skillc.opencode-runtime="1.18.16" \
org.skillc.node-runtime="22.20.0" \
org.skillc.opencode-runtime-build="${RUNTIME_BUILD_REVISION}" \
org.skillc.opencode-runtime-source="${RUNTIME_SOURCE_FINGERPRINT}"