v1.1.0: Alpine 轻量级 Docker 开发环境 + 敏感凭证清理
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
SSHD_PID=0
|
||||
TTYD_PID=0
|
||||
|
||||
cleanup() {
|
||||
echo "[entrypoint] 收到终止信号,正在关闭服务..."
|
||||
[ "$TTYD_PID" -ne 0 ] && kill "$TTYD_PID" 2>/dev/null
|
||||
[ "$SSHD_PID" -ne 0 ] && kill "$SSHD_PID" 2>/dev/null
|
||||
wait 2>/dev/null
|
||||
echo "[entrypoint] 服务已关闭"
|
||||
exit 0
|
||||
}
|
||||
|
||||
trap cleanup SIGTERM SIGINT SIGQUIT
|
||||
|
||||
# 自动检测 /root 下的开发工具并设置 PATH
|
||||
[ -d /root/.cargo/bin ] && export PATH="/root/.cargo/bin:$PATH"
|
||||
[ -d /root/.rustup ] && export RUSTUP_HOME=/root/.rustup CARGO_HOME=/root/.cargo
|
||||
[ -d /root/gvm/gos ] && export PATH="/root/gvm/gos/current/bin:$PATH"
|
||||
[ -d /root/.pyenv/shims ] && export PATH="/root/.pyenv/shims:$PATH"
|
||||
[ -d /root/.pyenv/bin ] && export PATH="/root/.pyenv/bin:$PATH"
|
||||
[ -d /root/go/bin ] && export PATH="/root/go/bin:$PATH" && export GOROOT=/root/go
|
||||
[ -d /root/.local/bin ] && export PATH="/root/.local/bin:$PATH"
|
||||
|
||||
# 检测 Rust 独立安装(非 rustup)
|
||||
RUST_DIR=$(ls -d /root/rust-*/bin 2>/dev/null | head -1)
|
||||
[ -n "$RUST_DIR" ] && export PATH="$RUST_DIR:$PATH"
|
||||
|
||||
# 创建非 root 用户 developer(用于 Claude Code 全权限沙箱)
|
||||
id developer 2>/dev/null || adduser -D -s /bin/bash developer
|
||||
mkdir -p /etc/sudoers.d
|
||||
echo "developer ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/developer
|
||||
chmod 440 /etc/sudoers.d/developer
|
||||
mkdir -p /home/developer/.claude
|
||||
chown -R developer:developer /home/developer
|
||||
|
||||
# Claude Code 全权限配置 —— root 用户
|
||||
mkdir -p /root/.claude
|
||||
cat > /root/.claude/settings.json << 'SETTINGS'
|
||||
{
|
||||
"permissions": {
|
||||
"allow": ["*"],
|
||||
"deny": []
|
||||
}
|
||||
}
|
||||
SETTINGS
|
||||
|
||||
# Claude Code 全权限配置 —— developer 用户
|
||||
cat > /home/developer/.claude/settings.json << 'SETTINGS'
|
||||
{
|
||||
"permissions": {
|
||||
"allow": ["*"],
|
||||
"deny": []
|
||||
}
|
||||
}
|
||||
SETTINGS
|
||||
chown developer:developer /home/developer/.claude/settings.json
|
||||
|
||||
# 创建便捷别名(含 Claude Code 密钥环境变量)
|
||||
# root 用 --allow-dangerously-skip-permissions(root 禁止 --dangerously-skip-permissions)
|
||||
# developer 用 --dangerously-skip-permissions
|
||||
cat > /home/developer/.bashrc << BASHRC
|
||||
alias claude='claude --dangerously-skip-permissions'
|
||||
export PATH="/usr/local/bin:/usr/bin:/bin:\$PATH"
|
||||
export ANTHROPIC_AUTH_TOKEN="${ANTHROPIC_AUTH_TOKEN}"
|
||||
export ANTHROPIC_BASE_URL="${ANTHROPIC_BASE_URL}"
|
||||
export API_TIMEOUT_MS="${API_TIMEOUT_MS:-3000000}"
|
||||
export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC="${CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:-1}"
|
||||
BASHRC
|
||||
chown developer:developer /home/developer/.bashrc
|
||||
|
||||
# root 的全局别名
|
||||
cat > /root/.bashrc << 'ROOTRC'
|
||||
alias claude='claude --allow-dangerously-skip-permissions'
|
||||
ROOTRC
|
||||
|
||||
# 写入 /etc/profile.d/ 让所有 shell 会话生效
|
||||
cat > /etc/profile.d/dev-tools.sh << 'PROFILE'
|
||||
[ -d /root/.cargo/bin ] && export PATH="/root/.cargo/bin:$PATH" && export RUSTUP_HOME=/root/.rustup CARGO_HOME=/root/.cargo
|
||||
[ -d /root/gvm/gos ] && source /root/gvm/scripts/gvm 2>/dev/null
|
||||
[ -d /root/.pyenv/shims ] && export PATH="/root/.pyenv/shims:/root/.pyenv/bin:$PATH"
|
||||
[ -d /root/go/bin ] && export PATH="/root/go/bin:$PATH" && export GOROOT=/root/go
|
||||
[ -d /root/.local/bin ] && export PATH="/root/.local/bin:$PATH"
|
||||
RUST_DIR=$(ls -d /root/rust-*/bin 2>/dev/null | head -1)
|
||||
[ -n "$RUST_DIR" ] && export PATH="$RUST_DIR:$PATH"
|
||||
PROFILE
|
||||
|
||||
/usr/sbin/sshd
|
||||
echo "[entrypoint] SSH 已启动"
|
||||
|
||||
ttyd -W -c jc:1234567 -t fontSize=16 -t theme='{"background":"#1a1a2e"}' /opt/ttyd-session.sh &
|
||||
TTYD_PID=$!
|
||||
|
||||
sleep 1
|
||||
if ! kill -0 "$TTYD_PID" 2>/dev/null; then
|
||||
echo "[entrypoint] 错误: ttyd 启动失败"
|
||||
exit 1
|
||||
fi
|
||||
echo "[entrypoint] ttyd 已启动 (PID: $TTYD_PID)"
|
||||
|
||||
if ! pidof sshd > /dev/null; then
|
||||
echo "[entrypoint] 错误: sshd 启动失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "========================================"
|
||||
echo " WorkPod Test 开发环境已就绪"
|
||||
echo "========================================"
|
||||
echo "Node: $(node --version)"
|
||||
echo "npm: $(npm --version)"
|
||||
echo ""
|
||||
echo "AI 工具:"
|
||||
echo " Claude Code: $(claude --version 2>/dev/null || echo '未安装')"
|
||||
echo ""
|
||||
echo "开发工具:"
|
||||
echo " Rust: $(rustc --version 2>/dev/null || echo '未安装')"
|
||||
echo " Go: $(go version 2>/dev/null || echo '未安装')"
|
||||
echo " Python: $(python3 --version 2>/dev/null || echo '未安装')"
|
||||
echo ""
|
||||
echo "连接方式:"
|
||||
echo " Web: http://localhost:7682"
|
||||
echo " SSH: ssh root@localhost -p 2223 (密码: workpod123)"
|
||||
echo "========================================"
|
||||
|
||||
exec sleep infinity
|
||||
Reference in New Issue
Block a user