Spaces:
Running
Running
File size: 5,860 Bytes
5bee529 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | FROM python:3.14.3-slim-bookworm
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC
ENV PORT=7860
ENV HOME=/home/coder
ENV PIP_DISABLE_PIP_VERSION_CHECK=1
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ARG CODE_SERVER_VERSION=4.109.2
ARG KOTLIN_VERSION=1.9.25
ARG ANDROID_CMDLINE_TOOLS_VERSION=11076708
ARG ANDROID_PLATFORM=34
ARG ANDROID_BUILD_TOOLS=34.0.0
ARG GO_VERSION=1.26.1
ARG NODE_VERSION=25.8.1
ENV KOTLIN_HOME=/opt/kotlin
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV ANDROID_HOME=/opt/android-sdk
ENV GOROOT=/usr/local/go
ENV GOPATH=/home/coder/go
ENV PLAYWRIGHT_BROWSERS_PATH=/opt/ms-playwright
ENV PATH="${PATH}:${KOTLIN_HOME}/bin:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:${ANDROID_SDK_ROOT}/platform-tools:${GOROOT}/bin:${GOPATH}/bin"
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates curl git bash sudo tini jq procps unzip gnupg xz-utils \
# C/C++ toolchain + headers
build-essential gcc g++ make cmake ninja-build gdb clang clangd \
libc6-dev linux-libc-dev pkg-config \
# Java
openjdk-17-jdk-headless maven \
# Databases
default-mysql-server default-mysql-client \
postgresql postgresql-client \
redis-server redis-tools \
# Rust + Go
rustc cargo rustfmt \
&& rm -rf /var/lib/apt/lists/*
# Install code-server (pinned version)
RUN curl -fsSL "https://github.com/coder/code-server/releases/download/v${CODE_SERVER_VERSION}/code-server_${CODE_SERVER_VERSION}_amd64.deb" -o /tmp/code-server.deb \
&& dpkg -i /tmp/code-server.deb \
&& rm -f /tmp/code-server.deb
# Node.js (official tarball, pinned to the latest current release)
RUN curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz" -o /tmp/node.tar.xz \
&& tar -xJf /tmp/node.tar.xz -C /usr/local --strip-components=1 \
&& rm -f /tmp/node.tar.xz \
&& node --version \
&& npm --version
# Docker Engine + CLI + Buildx + Compose (official Docker apt repo)
RUN install -m 0755 -d /etc/apt/keyrings \
&& curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc \
&& chmod a+r /etc/apt/keyrings/docker.asc \
&& printf "Types: deb\nURIs: https://download.docker.com/linux/debian\nSuites: %s\nComponents: stable\nArchitectures: %s\nSigned-By: /etc/apt/keyrings/docker.asc\n" "$(. /etc/os-release && echo "$VERSION_CODENAME")" "$(dpkg --print-architecture)" > /etc/apt/sources.list.d/docker.sources \
&& apt-get update \
&& apt-get install -y --no-install-recommends docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin \
&& rm -rf /var/lib/apt/lists/*
# Kotlin compiler
RUN curl -fsSL "https://github.com/JetBrains/kotlin/releases/download/v${KOTLIN_VERSION}/kotlin-compiler-${KOTLIN_VERSION}.zip" -o /tmp/kotlin.zip \
&& unzip -q /tmp/kotlin.zip -d /opt \
&& mv /opt/kotlinc "${KOTLIN_HOME}" \
&& ln -s "${KOTLIN_HOME}/bin/kotlin" /usr/local/bin/kotlin \
&& ln -s "${KOTLIN_HOME}/bin/kotlinc" /usr/local/bin/kotlinc \
&& rm -f /tmp/kotlin.zip
# Go (official tarball for newer version than Debian repos)
RUN curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" -o /tmp/go.tgz \
&& rm -rf /usr/local/go \
&& tar -C /usr/local -xzf /tmp/go.tgz \
&& rm -f /tmp/go.tgz
# Android SDK command-line tools + common packages
RUN mkdir -p "${ANDROID_SDK_ROOT}/cmdline-tools" \
&& curl -fsSL "https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_CMDLINE_TOOLS_VERSION}_latest.zip" -o /tmp/android-tools.zip \
&& unzip -q /tmp/android-tools.zip -d "${ANDROID_SDK_ROOT}/cmdline-tools" \
&& mv "${ANDROID_SDK_ROOT}/cmdline-tools/cmdline-tools" "${ANDROID_SDK_ROOT}/cmdline-tools/latest" \
&& rm -f /tmp/android-tools.zip \
&& yes | "${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager" --sdk_root="${ANDROID_SDK_ROOT}" --licenses \
&& "${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager" --sdk_root="${ANDROID_SDK_ROOT}" \
"platform-tools" "platforms;android-${ANDROID_PLATFORM}" "build-tools;${ANDROID_BUILD_TOOLS}"
# Python core deps
RUN pip install --no-cache-dir --upgrade pip setuptools wheel && \
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 pip install --no-cache-dir \
numpy pandas scipy scikit-learn matplotlib \
jupyterlab ipykernel notebook \
requests httpx aiohttp pyyaml python-dotenv tqdm rich \
fastapi uvicorn[standard] pydantic flask \
sqlalchemy alembic psycopg2-binary redis \
pytest black isort ruff mypy \
playwright
# Codex CLI + Playwright + Playwright MCP
# Remove pip-installed playwright CLI to avoid npm binary conflict
RUN rm -f /usr/local/bin/playwright \
&& npm install -g @openai/codex playwright @playwright/mcp \
&& npm cache clean --force
# Playwright browsers + system deps (Chromium/Firefox/WebKit)
RUN mkdir -p "${PLAYWRIGHT_BROWSERS_PATH}" \
&& playwright install --with-deps
# Create user
RUN groupadd -f docker \
&& useradd -m -u 1000 -s /bin/bash -G docker coder \
&& echo "coder ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \
&& mkdir -p /home/coder/.config/code-server /home/coder/.codex /home/coder/go \
&& chown -R coder:coder /home/coder /opt/kotlin /opt/android-sdk /opt/ms-playwright
# Quick toolchain checks (build-time)
RUN printf '#include <stdio.h>\nint main(){puts("ok");return 0;}\n' > /tmp/t.c \
&& gcc /tmp/t.c -o /tmp/t \
&& /tmp/t | grep -q ok \
&& python --version \
&& node --version \
&& npm --version \
&& docker --version \
&& docker buildx version \
&& docker compose version \
&& rm -f /tmp/t.c /tmp/t
COPY --chown=coder:coder start.sh /usr/local/bin/start.sh
RUN chmod +x /usr/local/bin/start.sh
USER coder
WORKDIR /home/coder
EXPOSE 7860
ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ["/usr/local/bin/start.sh"]
|