cacode commited on
Commit
be2a1d7
·
verified ·
1 Parent(s): 5f443a3

Upload 2 files

Browse files
Files changed (2) hide show
  1. Dockerfile +78 -0
  2. start.sh +110 -0
Dockerfile ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM debian:bookworm-slim
2
+
3
+ ENV DEBIAN_FRONTEND=noninteractive
4
+ ENV TZ=Etc/UTC
5
+ ENV PORT=7860
6
+ ENV HOME=/home/coder
7
+ ENV PIP_DISABLE_PIP_VERSION_CHECK=1
8
+ ENV PYTHONDONTWRITEBYTECODE=1
9
+ ENV PYTHONUNBUFFERED=1
10
+
11
+ # 1) 系统与开发工具(重度版)
12
+ RUN apt-get update && apt-get install -y --no-install-recommends \
13
+ ca-certificates curl wget git bash sudo tini gnupg dirmngr jq \
14
+ # 常用工具
15
+ unzip zip xz-utils less vim nano openssh-client \
16
+ # C/C++
17
+ build-essential gcc g++ make cmake ninja-build gdb lldb clang clangd pkg-config \
18
+ # Python
19
+ python3 python3-pip python3-venv python3-dev \
20
+ # Java + build tools
21
+ openjdk-17-jdk maven gradle \
22
+ # Node.js
23
+ nodejs npm \
24
+ # 其他
25
+ ripgrep fd-find \
26
+ && rm -rf /var/lib/apt/lists/*
27
+
28
+ # 2) 安装 code-server
29
+ RUN curl -fsSL https://code-server.dev/install.sh | sh
30
+
31
+ # 3) 安装 Node 包管理器补充
32
+ RUN npm install -g yarn pnpm
33
+
34
+ # 4) Python 常见依赖(可按需删减)
35
+ RUN python3 -m pip install --no-cache-dir --upgrade pip setuptools wheel && \
36
+ python3 -m pip install --no-cache-dir \
37
+ numpy pandas scipy scikit-learn matplotlib seaborn plotly \
38
+ jupyter jupyterlab ipykernel notebook \
39
+ requests httpx aiohttp pyyaml python-dotenv tqdm rich \
40
+ flask fastapi uvicorn[standard] pydantic \
41
+ sqlalchemy alembic psycopg2-binary redis \
42
+ pytest pytest-cov black isort mypy ruff pre-commit
43
+
44
+ # 5) 安装 Rust(stable)
45
+ RUN curl https://sh.rustup.rs -sSf | bash -s -- -y
46
+ ENV PATH="/root/.cargo/bin:${PATH}"
47
+
48
+ # 6) 安装 Go(Debian 包,稳定即可)
49
+ RUN apt-get update && apt-get install -y --no-install-recommends golang-go && \
50
+ rm -rf /var/lib/apt/lists/*
51
+
52
+ # 7) 安装 Codex CLI(若仓库不可用,不阻断)
53
+ RUN npm install -g @openai/codex || true
54
+
55
+ # 8) 创建用户
56
+ RUN useradd -m -u 1000 -s /bin/bash coder && \
57
+ echo "coder ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
58
+ mkdir -p /home/coder/.config/code-server /home/coder/.codex && \
59
+ chown -R coder:coder /home/coder
60
+
61
+ # 9) 预装常用 VSCode 扩展(失败不阻断)
62
+ RUN code-server --install-extension ms-python.python || true && \
63
+ code-server --install-extension ms-toolsai.jupyter || true && \
64
+ code-server --install-extension ms-vscode.cpptools || true && \
65
+ code-server --install-extension llvm-vs-code-extensions.vscode-clangd || true && \
66
+ code-server --install-extension vscjava.vscode-java-pack || true && \
67
+ code-server --install-extension redhat.vscode-yaml || true && \
68
+ code-server --install-extension esbenp.prettier-vscode || true
69
+
70
+ COPY --chown=coder:coder start.sh /usr/local/bin/start.sh
71
+ RUN chmod +x /usr/local/bin/start.sh
72
+
73
+ USER coder
74
+ WORKDIR /home/coder
75
+
76
+ EXPOSE 7860
77
+ ENTRYPOINT ["/usr/bin/tini", "--"]
78
+ CMD ["/usr/local/bin/start.sh"]
start.sh ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ PORT="${PORT:-7860}"
5
+
6
+ # 必须:code-server 登录密码
7
+ if [[ -z "${PASSWORD:-}" && -z "${HASHED_PASSWORD:-}" ]]; then
8
+ echo "[ERROR] Missing PASSWORD/HASHED_PASSWORD secret."
9
+ exit 1
10
+ fi
11
+
12
+ # Hugging Face 持久化目录
13
+ if [[ -d "/data" ]]; then
14
+ WORKDIR="/data/workspace"
15
+ EXT_DIR="/data/code-server/extensions"
16
+ USER_DATA_DIR="/data/code-server/user-data"
17
+ CODEX_DIR="/data/.codex"
18
+ else
19
+ WORKDIR="${HOME}/workspace"
20
+ EXT_DIR="${HOME}/.local/share/code-server/extensions"
21
+ USER_DATA_DIR="${HOME}/.local/share/code-server/user-data"
22
+ CODEX_DIR="${HOME}/.codex"
23
+ fi
24
+
25
+ mkdir -p "$WORKDIR" "$EXT_DIR" "$USER_DATA_DIR" "${HOME}/.config/code-server" "$CODEX_DIR"
26
+
27
+ # -------------------------
28
+ # code-server 配置
29
+ # -------------------------
30
+ CONFIG_FILE="${HOME}/.config/code-server/config.yaml"
31
+ {
32
+ echo "bind-addr: 0.0.0.0:${PORT}"
33
+ echo "auth: password"
34
+ if [[ -n "${HASHED_PASSWORD:-}" ]]; then
35
+ echo "hashed-password: ${HASHED_PASSWORD}"
36
+ else
37
+ echo "password: ${PASSWORD}"
38
+ fi
39
+ echo "cert: false"
40
+ } > "$CONFIG_FILE"
41
+
42
+ # -------------------------
43
+ # Codex 配置文件 config.toml
44
+ # -------------------------
45
+ # 允许用环境变量覆盖;默认就是你给的参数
46
+ : "${CODEX_MODEL_PROVIDER:=sub2api}"
47
+ : "${CODEX_MODEL:=gpt-5.3-codex}"
48
+ : "${CODEX_REASONING_EFFORT:=high}"
49
+ : "${CODEX_NETWORK_ACCESS:=enabled}"
50
+ : "${CODEX_DISABLE_RESPONSE_STORAGE:=true}"
51
+ : "${CODEX_WSL_ACK:=true}"
52
+ : "${CODEX_VERBOSITY:=high}"
53
+ : "${CODEX_PROVIDER_NAME:=sub2api}"
54
+ : "${CODEX_BASE_URL:=https://ai.qaq.al}"
55
+ : "${CODEX_WIRE_API:=responses}"
56
+ : "${CODEX_REQUIRES_OPENAI_AUTH:=true}"
57
+
58
+ cat > "${CODEX_DIR}/config.toml" <<EOF
59
+ model_provider = "${CODEX_MODEL_PROVIDER}"
60
+ model = "${CODEX_MODEL}"
61
+ model_reasoning_effort = "${CODEX_REASONING_EFFORT}"
62
+ network_access = "${CODEX_NETWORK_ACCESS}"
63
+ disable_response_storage = ${CODEX_DISABLE_RESPONSE_STORAGE}
64
+ windows_wsl_setup_acknowledged = ${CODEX_WSL_ACK}
65
+ model_verbosity = "${CODEX_VERBOSITY}"
66
+
67
+ [model_providers.${CODEX_PROVIDER_NAME}]
68
+ name = "${CODEX_PROVIDER_NAME}"
69
+ base_url = "${CODEX_BASE_URL}"
70
+ wire_api = "${CODEX_WIRE_API}"
71
+ requires_openai_auth = ${CODEX_REQUIRES_OPENAI_AUTH}
72
+ EOF
73
+
74
+ # -------------------------
75
+ # Codex auth.json
76
+ # -------------------------
77
+ # 推荐用 HF Secrets 注入 OPENAI_API_KEY
78
+ # 或者直接放完整 JSON 到 CODEX_AUTH_JSON
79
+ if [[ -n "${CODEX_AUTH_JSON:-}" ]]; then
80
+ printf '%s\n' "${CODEX_AUTH_JSON}" > "${CODEX_DIR}/auth.json"
81
+ elif [[ -n "${OPENAI_API_KEY:-}" ]]; then
82
+ cat > "${CODEX_DIR}/auth.json" <<EOF
83
+ {
84
+ "OPENAI_API_KEY": "${OPENAI_API_KEY}"
85
+ }
86
+ EOF
87
+ else
88
+ echo "[WARN] No OPENAI_API_KEY/CODEX_AUTH_JSON found. Codex auth.json not generated."
89
+ fi
90
+
91
+ chmod 600 "${CODEX_DIR}/auth.json" 2>/dev/null || true
92
+ chmod 600 "${CODEX_DIR}/config.toml" 2>/dev/null || true
93
+
94
+ # 把 /data 的 codex 配置软链到 ~/.codex(避免路径不一致)
95
+ if [[ "$CODEX_DIR" != "${HOME}/.codex" ]]; then
96
+ rm -rf "${HOME}/.codex"
97
+ ln -s "$CODEX_DIR" "${HOME}/.codex"
98
+ fi
99
+
100
+ echo "[INFO] Environment ready."
101
+ echo "[INFO] Java: $(java -version 2>&1 | head -n1 || true)"
102
+ echo "[INFO] Python: $(python3 --version || true)"
103
+ echo "[INFO] Node: $(node --version || true)"
104
+ echo "[INFO] g++: $(g++ --version | head -n1 || true)"
105
+ echo "[INFO] Codex config path: ${HOME}/.codex/config.toml"
106
+
107
+ exec code-server "$WORKDIR" \
108
+ --extensions-dir "$EXT_DIR" \
109
+ --user-data-dir "$USER_DATA_DIR" \
110
+ --disable-telemetry