Files
llgo/dev/Dockerfile.dev
2025-12-13 22:48:05 +08:00

152 lines
5.0 KiB
Docker

# syntax=docker/dockerfile:1
ARG UBUNTU_VERSION=24.04
ARG BASE_IMAGE=ubuntu:${UBUNTU_VERSION}
FROM ${BASE_IMAGE} AS base
ARG DEBIAN_FRONTEND=noninteractive
ARG LLVM_VERSION=19
ARG GO_VERSION=1.24.2
ARG CARGS_VERSION=1.0.0
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
curl \
git \
bash \
rsync \
sudo \
lsb-release \
gnupg \
unzip \
wget \
build-essential \
pkg-config \
python3 \
python3-venv \
python3-pip \
python3-dev \
libgc-dev \
libssl-dev \
zlib1g-dev \
libffi-dev \
libcjson-dev \
libuv1-dev \
libsqlite3-dev \
&& rm -rf /var/lib/apt/lists/*
# LLVM/Clang toolchain (matches .github/actions/setup-deps for Ubuntu).
RUN set -eux; \
. /etc/os-release; \
echo "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME}-${LLVM_VERSION} main" > /etc/apt/sources.list.d/llvm.list; \
if ! curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key | gpg --dearmor -o /etc/apt/trusted.gpg.d/llvm.gpg; then \
echo "failed to fetch llvm gpg key; aborting (avoid unverified LLVM packages)" >&2; \
exit 1; \
fi; \
apt-get update; \
if ! apt-get install -y --no-install-recommends \
llvm-${LLVM_VERSION}-dev \
clang-${LLVM_VERSION} \
libclang-${LLVM_VERSION}-dev \
lld-${LLVM_VERSION} \
libunwind-${LLVM_VERSION}-dev \
libc++-${LLVM_VERSION}-dev \
; then \
echo "apt.llvm.org install failed; falling back to distro LLVM packages" >&2; \
apt-get update; \
apt-get install -y --no-install-recommends llvm clang lld libunwind-dev libc++-dev; \
fi; \
if command -v "clang-${LLVM_VERSION}" >/dev/null 2>&1; then \
ln -sf "$(command -v "clang-${LLVM_VERSION}")" /usr/local/bin/clang; \
fi; \
if command -v "clang++-${LLVM_VERSION}" >/dev/null 2>&1; then \
ln -sf "$(command -v "clang++-${LLVM_VERSION}")" /usr/local/bin/clang++; \
fi; \
if command -v "lld-${LLVM_VERSION}" >/dev/null 2>&1; then \
ln -sf "$(command -v "lld-${LLVM_VERSION}")" /usr/local/bin/lld; \
fi; \
if command -v "ld.lld-${LLVM_VERSION}" >/dev/null 2>&1; then \
ln -sf "$(command -v "ld.lld-${LLVM_VERSION}")" /usr/local/bin/ld.lld; \
fi; \
rm -rf /var/lib/apt/lists/*
# Go toolchain (pin like CI to avoid toolchain auto-download flakiness).
RUN set -eux; \
arch="$(dpkg --print-architecture)"; \
case "$arch" in \
amd64) goarch="amd64" ;; \
arm64) goarch="arm64" ;; \
i386) goarch="386" ;; \
*) echo "unsupported arch: $arch" >&2; exit 1 ;; \
esac; \
curl -fL "https://go.dev/dl/go${GO_VERSION}.linux-${goarch}.tar.gz" -o /tmp/go.tgz; \
rm -rf /usr/local/go; \
tar -C /usr/local -xzf /tmp/go.tgz; \
rm -f /tmp/go.tgz
RUN python3 -m venv /opt/venv && /opt/venv/bin/pip install -U pip setuptools wheel
ENV GOPATH="/go"
ENV GOMODCACHE="/go/pkg/mod"
ENV GOCACHE="/root/.cache/go-build"
RUN mkdir -p "$GOMODCACHE" "$GOCACHE" "$GOPATH/bin"
ENV PATH="/opt/venv/bin:/usr/lib/llvm-${LLVM_VERSION}/bin:/usr/local/go/bin:${GOPATH}/bin:${PATH}"
ENV CC="clang"
ENV CXX="clang++"
ENV GOTOOLCHAIN="local"
ENV LLGO_ASSETS_DIR="/opt/llgo-assets"
WORKDIR /tmp/llgo-mod
COPY go.mod go.sum ./
COPY runtime/go.mod runtime/go.sum ./runtime/
RUN go mod download
ARG TARGETARCH
RUN set -eux; \
mkdir -p "${LLGO_ASSETS_DIR}/llama2-c"; \
curl -fL "https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin" -o "${LLGO_ASSETS_DIR}/llama2-c/stories15M.bin"; \
mkdir -p "${LLGO_ASSETS_DIR}/cargs"; \
if [ "${TARGETARCH}" = "amd64" ]; then \
cargs_pkg="cargs_linux_amd64.zip"; \
elif [ "${TARGETARCH}" = "arm64" ]; then \
cargs_pkg="cargs_linux_arm64.zip"; \
elif [ "${TARGETARCH}" = "386" ]; then \
cargs_pkg="cargs_linux_386.zip"; \
else \
echo "skip cargs linux asset for TARGETARCH=${TARGETARCH}"; \
cargs_pkg=""; \
fi; \
if [ -n "${cargs_pkg}" ]; then \
cargs_url="https://github.com/goplus/llpkg/releases/download/cargs/v${CARGS_VERSION}/${cargs_pkg}"; \
if curl -fL "${cargs_url}" -o /tmp/cargs.zip; then \
unzip -q /tmp/cargs.zip -d "${LLGO_ASSETS_DIR}/cargs"; \
rm -f /tmp/cargs.zip; \
else \
if [ "${TARGETARCH}" = "386" ]; then \
echo "warning: cargs asset not available (${cargs_url}); continuing without cargs" >&2; \
else \
echo "error: failed to download cargs asset (${cargs_url})" >&2; \
exit 1; \
fi; \
fi; \
prefix="${LLGO_ASSETS_DIR}/cargs"; \
if [ -d "${prefix}/lib/pkgconfig" ]; then \
for tmpl in "${prefix}/lib/pkgconfig"/*.pc.tmpl; do \
[ -f "${tmpl}" ] || continue; \
pc_file="${tmpl%.tmpl}"; \
sed "s|{{.Prefix}}|${prefix}|g" "${tmpl}" > "${pc_file}"; \
done; \
fi; \
fi
WORKDIR /repo
FROM base AS pydeps
# Optional demo deps used by _demo/py (numpy/torch). Keep in a separate target
# so users can build a smaller image when needed.
RUN set -eux; \
pip install numpy && \
(pip install torch --index-url https://download.pytorch.org/whl/cpu || pip install torch)