Files

104 lines
3.4 KiB
Docker

# Agent Sandbox — isolated Linux environment for CLI coding agents
# Designed for macOS hosts (Docker Desktop / OrbStack)
FROM ubuntu:24.04
ARG TARGETARCH
ARG DEBIAN_FRONTEND=noninteractive
ARG USERNAME=agent
ARG USER_UID=1000
ARG USER_GID=1000
LABEL org.opencontainers.image.title="asandbox" \
org.opencontainers.image.description="Secure Docker sandbox for CLI AI coding agents" \
org.opencontainers.image.source="local"
# Base tools
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
curl \
wget \
git \
gnupg \
openssh-client \
sudo \
less \
nano \
vim-tiny \
jq \
unzip \
zip \
tar \
gzip \
bzip2 \
xz-utils \
build-essential \
python3 \
python3-pip \
python3-venv \
python3-dev \
ripgrep \
fd-find \
tree \
rsync \
locales \
tzdata \
procps \
iproute2 \
iputils-ping \
dnsutils \
&& rm -rf /var/lib/apt/lists/* \
&& ln -sf /usr/bin/fdfind /usr/local/bin/fd \
&& locale-gen en_US.UTF-8
ENV LANG=en_US.UTF-8 \
LC_ALL=en_US.UTF-8 \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
PIP_NO_CACHE_DIR=1 \
NPM_CONFIG_UPDATE_NOTIFIER=false \
NPM_CONFIG_FUND=false
# Node.js 22 LTS (many agents are Node-based)
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
&& apt-get install -y --no-install-recommends nodejs \
&& rm -rf /var/lib/apt/lists/* \
&& corepack enable || true
# uv (fast Python package manager)
RUN curl -LsSf https://astral.sh/uv/install.sh | sh \
&& mv /root/.local/bin/uv /usr/local/bin/uv \
&& mv /root/.local/bin/uvx /usr/local/bin/uvx 2>/dev/null || true
# Create non-root user matching host UID/GID when possible (macOS staff=20 often exists as dialout)
RUN set -eux; \
if getent group "${USER_GID}" >/dev/null; then \
EXISTING_GROUP="$(getent group "${USER_GID}" | cut -d: -f1)"; \
useradd --uid "${USER_UID}" --gid "${USER_GID}" -m -s /bin/bash "${USERNAME}" \
|| useradd --uid "${USER_UID}" -g "${EXISTING_GROUP}" -m -s /bin/bash "${USERNAME}"; \
else \
groupadd --gid "${USER_GID}" "${USERNAME}"; \
useradd --uid "${USER_UID}" --gid "${USER_GID}" -m -s /bin/bash "${USERNAME}"; \
fi; \
echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/${USERNAME}"; \
chmod 0440 "/etc/sudoers.d/${USERNAME}"
# installagent + shell integration (agents installed on demand inside shell)
COPY installagent /usr/local/bin/installagent
COPY entrypoint.sh /usr/local/bin/asandbox-entrypoint
COPY bashrc.asandbox /etc/asandbox.bashrc
RUN chmod +x /usr/local/bin/installagent /usr/local/bin/asandbox-entrypoint \
&& echo 'source /etc/asandbox.bashrc' >> /home/${USERNAME}/.bashrc \
&& echo 'source /etc/asandbox.bashrc' >> /home/${USERNAME}/.profile \
&& mkdir -p /home/${USERNAME}/.local/bin /home/${USERNAME}/.npm-global/bin \
&& chown -R ${USERNAME} /home/${USERNAME}
# Workspace mount point (host path is also bind-mounted at real path)
RUN mkdir -p /workspace && chown ${USERNAME} /workspace
WORKDIR /workspace
USER ${USERNAME}
ENV HOME=/home/${USERNAME} \
PATH="/home/${USERNAME}/.local/bin:/home/${USERNAME}/.npm-global/bin:/usr/local/bin:${PATH}"
ENTRYPOINT ["/usr/local/bin/asandbox-entrypoint"]
CMD ["bash", "-l"]