Dockerfile•2.52 kB
# ----- BUILD ARGS (change in one place) ----
ARG UBUNTU_VER=22.04
ARG NODE_VER=20.19.2 # LTS (pin!)
ARG GO_VER=1.23.4 # latest stable
# ----
FROM ubuntu:${UBUNTU_VER} AS base
# Get platform info for cross-platform builds
ARG TARGETARCH
# Re-declare build args for this stage
ARG NODE_VER=20.19.2
ARG GO_VER=1.23.4
ENV DEBIAN_FRONTEND=noninteractive \
TZ=Etc/UTC \
PATH="/home/agent/.local/bin:/home/agent/.npm-global/bin:/home/agent/go/bin:/usr/local/go/bin:${PATH}"
# ---- APT ---
RUN --mount=type=cache,target=/var/cache/apt \
apt-get update -qq && \
apt-get install -y --no-install-recommends \
diffutils bash coreutils findutils procps less vim-tiny nano \
curl wget zip unzip tar git ca-certificates tree libsqlite3-dev \
jq ripgrep fd-find iproute2 dnsutils netcat-openbsd sqlite3 \
htop lsof openssl python3 python3-venv python3-pip python3-dev \
build-essential pkg-config gnupg software-properties-common && \
apt-get clean && rm -rf /var/lib/apt/lists/*
# ---- NODE (cross-platform) -----
RUN case "${TARGETARCH}" in \
amd64) NODE_ARCH=x64 ;; \
arm64) NODE_ARCH=arm64 ;; \
*) echo "Unsupported architecture: ${TARGETARCH}" && exit 1 ;; \
esac \
&& curl -fsSL "https://nodejs.org/dist/v${NODE_VER}/node-v${NODE_VER}-linux-${NODE_ARCH}.tar.xz" -o /tmp/node.tar.xz \
&& tar -xJf /tmp/node.tar.xz -C /usr/local --strip-components=1 \
&& rm /tmp/node.tar.xz
# ---- GO (cross-platform) ----
RUN case "${TARGETARCH}" in \
amd64) GO_ARCH=amd64 ;; \
arm64) GO_ARCH=arm64 ;; \
*) echo "Unsupported architecture: ${TARGETARCH}" && exit 1 ;; \
esac \
&& curl -fsSL https://go.dev/dl/go${GO_VER}.linux-${GO_ARCH}.tar.gz -o /tmp/go.tgz \
&& tar -C /usr/local -xzf /tmp/go.tgz \
&& rm /tmp/go.tgz
# ---- USER & DIRS ---
RUN groupadd -g 10001 agent && \
useradd -ms /bin/bash -u 10001 -g 10001 agent && \
mkdir -p /workspace /app && \
chown -R agent:agent /workspace /app
USER agent
# ---- PYTHON DEPS (using UV) ----
COPY --chown=agent:agent pyproject.toml uv.lock /app/
WORKDIR /app
RUN python3 -m pip install --no-cache-dir --user uv && \
/home/agent/.local/bin/uv sync --frozen
# ---- SERVER CODE ---
COPY --chown=agent:agent app/ /app/app/
# Create workspace directory
RUN mkdir -p /workspace && chown agent:agent /workspace
# MCP server uses stdio transport - no port exposure needed
CMD ["/home/agent/.local/bin/uv", "run", "python", "-m", "app.main"]