File size: 12,476 Bytes
96dd062 | 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 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 | ---
title: 使用Huggingface的免费Docker空间运行Code Server
published: 2026-02-24
description: 使用Huggingface的免费Docker空间部署一个含有Python,Java,C++,Rust,Go,Kotlin等常用编程语言的Code Server,并同时安装并部署Codex使用
image: ./covers/cover7.webp
tags: [软件开发, Codex, Code Server, Docker, Huggingface]
category: 软件开发
draft: false
---
## 方案涵盖的功能
- 支持Python,Java,C++,Rust,Go,Kotlin等常用编程语言
- 同时安装Android SDK
- 安装Codex,支持第三方中转API
- 预装Playwright及其MCP Server,便于Codex使用
- HF Space Free提供的2H16G服务器足够日常使用
## 方案仍有的不足
- 镜像臃肿,部署时间长
- 数据不可持久化保存
- 部分地区网络较差,HF延迟高(域名被墙)
## 部署教程
### 1.进入Huggingface,创建Docker Space
**前置条件:1.自备魔法上网 2.拥有Huggingface账号**
按照下图的方式新建一个Docker Space,选择Docker,Docker template为Blank



其他的不用修改,直接创建Space
### 2.进入Space,新建两个文件

#### 新建一个名为`Dockerfile`的文件,内容如下:
```Dockerfile
FROM python:3.11-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
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 \
# C/C++ toolchain + headers
build-essential gcc g++ make cmake ninja-build gdb clang clangd \
libc6-dev linux-libc-dev pkg-config \
# Java + Node
openjdk-17-jdk-headless maven \
nodejs npm \
# 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
# 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 useradd -m -u 1000 -s /bin/bash 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 C build check (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 \
&& 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"]
```
#### 新建一个名为`start.sh`的文件,内容如下
本方法的Codex使用三方api,因此需要配置api_key
有关Codex的相关配置在脚本`config.toml`部分,可使用环境变量的方式修改API_KEY和BASE_URL
`config.toml`的配置教程可参考上一篇文章,也可参考你自己模型提供商的教程
```start.sh
#!/usr/bin/env bash
set -euo pipefail
PORT="${PORT:-7860}"
if [[ -z "${PASSWORD:-}" && -z "${HASHED_PASSWORD:-}" ]]; then
echo "[ERROR] Missing PASSWORD/HASHED_PASSWORD secret."
exit 1
fi
if [[ -d "/data" ]]; then
WORKDIR="/data/workspace"
EXT_DIR="/data/code-server/extensions"
USER_DATA_DIR="/data/code-server/user-data"
CODEX_DIR="/data/.codex"
else
WORKDIR="${HOME}/workspace"
EXT_DIR="${HOME}/.local/share/code-server/extensions"
USER_DATA_DIR="${HOME}/.local/share/code-server/user-data"
CODEX_DIR="${HOME}/.codex"
fi
mkdir -p "$WORKDIR" "$EXT_DIR" "$USER_DATA_DIR" "${USER_DATA_DIR}/User" "${HOME}/.config/code-server" "$CODEX_DIR"
cat > "${HOME}/.config/code-server/config.yaml" <<EOF
bind-addr: 0.0.0.0:${PORT}
auth: password
cert: false
EOF
if [[ -n "${HASHED_PASSWORD:-}" ]]; then
echo "hashed-password: ${HASHED_PASSWORD}" >> "${HOME}/.config/code-server/config.yaml"
else
echo "password: ${PASSWORD}" >> "${HOME}/.config/code-server/config.yaml"
fi
# Codex config.toml
: "${CODEX_MODEL_PROVIDER:=sub2api}"
: "${CODEX_MODEL:=你想用的模型名称}"
: "${CODEX_REASONING_EFFORT:=xhigh}"
: "${CODEX_NETWORK_ACCESS:=enabled}"
: "${CODEX_DISABLE_RESPONSE_STORAGE:=true}"
: "${CODEX_WSL_ACK:=true}"
: "${CODEX_VERBOSITY:=high}"
: "${CODEX_PROVIDER_NAME:=sub2api}"
: "${CODEX_BASE_URL:=你的中转站地址}"
: "${CODEX_WIRE_API:=responses}"
: "${CODEX_REQUIRES_OPENAI_AUTH:=true}"
: "${PLAYWRIGHT_MCP_ENABLE:=true}"
: "${PLAYWRIGHT_MCP_HOST:=127.0.0.1}"
: "${PLAYWRIGHT_MCP_PORT:=8931}"
: "${PLAYWRIGHT_MCP_URL:=http://${PLAYWRIGHT_MCP_HOST}:${PLAYWRIGHT_MCP_PORT}/mcp}"
cat > "${CODEX_DIR}/config.toml" <<EOF
model_provider = "${CODEX_MODEL_PROVIDER}"
model = "${CODEX_MODEL}"
model_reasoning_effort = "${CODEX_REASONING_EFFORT}"
network_access = "${CODEX_NETWORK_ACCESS}"
disable_response_storage = ${CODEX_DISABLE_RESPONSE_STORAGE}
windows_wsl_setup_acknowledged = ${CODEX_WSL_ACK}
model_verbosity = "${CODEX_VERBOSITY}"
[model_providers.${CODEX_PROVIDER_NAME}]
name = "${CODEX_PROVIDER_NAME}"
base_url = "${CODEX_BASE_URL}"
wire_api = "${CODEX_WIRE_API}"
requires_openai_auth = ${CODEX_REQUIRES_OPENAI_AUTH}
EOF
if [[ "${PLAYWRIGHT_MCP_ENABLE}" == "true" ]]; then
cat >> "${CODEX_DIR}/config.toml" <<EOF
[mcp_servers.playwright]
url = "${PLAYWRIGHT_MCP_URL}"
EOF
fi
if [[ -n "${CODEX_AUTH_JSON:-}" ]]; then
printf '%s\n' "${CODEX_AUTH_JSON}" > "${CODEX_DIR}/auth.json"
elif [[ -n "${OPENAI_API_KEY:-}" ]]; then
cat > "${CODEX_DIR}/auth.json" <<EOF
{
"OPENAI_API_KEY": "${OPENAI_API_KEY}"
}
EOF
fi
chmod 600 "${CODEX_DIR}/config.toml" 2>/dev/null || true
chmod 600 "${CODEX_DIR}/auth.json" 2>/dev/null || true
if [[ "${CODEX_DIR}" != "${HOME}/.codex" ]]; then
rm -rf "${HOME}/.codex"
ln -s "${CODEX_DIR}" "${HOME}/.codex"
fi
# 默认中文界面
cat > "${USER_DATA_DIR}/User/locale.json" <<EOF
{
"locale": "zh-cn"
}
EOF
# 首次启动安装扩展(幂等)
EXT_MARKER="${USER_DATA_DIR}/.extensions_installed"
if [[ ! -f "${EXT_MARKER}" ]]; then
echo "[INFO] Installing extensions on first boot..."
install_ext() {
code-server --extensions-dir "${EXT_DIR}" --install-extension "$1" || true
}
# 你指定的 3 个(尽量装)
install_ext ms-vscode.cpptools
install_ext ms-vscode.cpptools-themes
install_ext ms-vscode.cpp-devtools
install_ext ms-vscode.cmake-tools
install_ext danielpinto8zz6.c-cpp-compile-run
install_ext golang.go
install_ext rust-lang.rust-analyzer
install_ext redhat.java
install_ext vscjava.vscode-java-debug
install_ext vscjava.vscode-java-test
install_ext vscjava.vscode-maven
install_ext vscjava.vscode-gradle
install_ext vscjava.vscode-java-dependency
install_ext ms-python.vscode-pylance
install_ext ms-python.python
install_ext ms-python.debugpy
install_ext ms-python.vscode-python-envs
install_ext ms-playwright.playwright
# Codex
install_ext openai.chatgpt
# 若微软扩展不可用,装稳定替代
install_ext MS-CEINTL.vscode-language-pack-zh-hans
install_ext llvm-vs-code-extensions.vscode-clangd
install_ext ms-vscode.makefile-tools
install_ext vadimcn.vscode-lldb
touch "${EXT_MARKER}"
fi
if [[ "${PLAYWRIGHT_MCP_ENABLE}" == "true" ]]; then
if command -v playwright-mcp >/dev/null 2>&1; then
echo "[INFO] Starting Playwright MCP server at ${PLAYWRIGHT_MCP_URL}"
nohup playwright-mcp --headless --browser chromium --no-sandbox --port "${PLAYWRIGHT_MCP_PORT}" --host "${PLAYWRIGHT_MCP_HOST}" >/tmp/playwright-mcp.log 2>&1 &
else
echo "[WARN] Playwright MCP not installed; skipping server start."
fi
fi
echo "[INFO] Java: $(java -version 2>&1 | head -n1 || true)"
echo "[INFO] Python: $(python --version || true)"
echo "[INFO] Pip: $(pip --version || true)"
echo "[INFO] Node: $(node --version || true)"
echo "[INFO] g++: $(g++ --version | head -n1 || true)"
echo "[INFO] Rust: $(rustc --version || true)"
echo "[INFO] Cargo: $(cargo --version || true)"
echo "[INFO] Go: $(go version || true)"
echo "[INFO] Playwright: $(playwright --version 2>/dev/null || true)"
exec code-server "$WORKDIR" \
--extensions-dir "$EXT_DIR" \
--user-data-dir "$USER_DATA_DIR" \
--disable-telemetry \
--disable-update-check \
--log warn
```
进入`README.md`,开放端口7860

等待程序开始构建(首次部署时间比较久)
### 3.进入Space Settings,新建两个Secret
**注意:一定是要Secret,确保API_KEY的安全性**

```
PASSWORD: 你自己设置的密码
API_KEY: 你在你的Codex渠道获取的API_KEY,具体可见上一篇文章
```
### 4.等待部署完成,开始愉快的使用
## 免责声明
**使用本教程产生的一切不良后果与本人无关,此方法可能会导致Huggingface账号被封禁,请自行承担风险使用本方法造成。另外,此部署方式文件缺少持久化存储,容器重启就会丢失,请配合保活使用** |