📦 安装步骤(Ubuntu/Debian 系统)
1. 安装 Docker 引擎
# 卸载旧版本(可选)
sudo apt remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt update
sudo apt install ca-certificates curl
# 添加官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
💡 验证安装:
sudo docker run hello-world
若输出 “Hello from Docker!” 则成功。
2. 配置镜像加速(国内用户必选)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://<你的阿里云镜像加速地址>"]
}
EOF
sudo systemctl restart docker
🔗 阿里云加速地址需登录容器镜像服务控制台获取。
3. 部署 Piston 服务
# 拉取 Piston 镜像
docker pull engineerman/piston
# 启动容器(关键配置)
docker run -d \
--name piston_api \
-p 2000:2000 \
--cap-add=SYS_ADMIN \
--tmpfs /piston/jobs:exec,uid=1000,gid=1000,mode=711 \
-v $(pwd)/piston_packages:/piston/packages \
engineerman/piston
⚠️ 安全注意:
--cap-add=SYS_ADMIN
为沙箱隔离必需权限tmpfs
挂载确保临时文件隔离销毁
⚙️ 自定义执行环境(以添加 AWS CLI 为例)
1. 修改 Bash 环境配置
编辑 piston/packages/bash/5.2.0/build.sh
:
#!/usr/bin/env bash
PREFIX=$(realpath $(dirname $0))
mkdir -p build
cd build
curl "https://ftp.gnu.org/gnu/bash/bash-5.2.tar.gz" -o bash.tar.gz
tar xzf bash.tar.gz --strip-components=1
./configure --prefix "$PREFIX"
make -j$(nproc)
make install -j$(nproc)
# 新增 AWS CLI 安装
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install -i $PREFIX/aws-cli -b $PREFIX/bin
rm -rf awscliv2.zip aws
2. 添加环境变量
编辑 environment
文件:
export PATH=$PWD/bin:$PATH
export PATH=$PWD/aws-cli:$PATH # 新增 AWS CLI 路径
3. 重建自定义包
docker exec -it piston_api sh
cd /piston/repo
sh build_package.sh bash=5.2.0
sh build_package.sh release # 发布到 GitHub
🔍 验证服务状态
# 测试 Python 代码执行
curl -X POST http://localhost:2000/api/v2/execute \
-H "Content-Type: application/json" \
-d '{
"language": "python",
"version": "3.10.0",
"files": [{"content": "print(1+1)"}]
}'
# 预期返回
{"run":{"stdout":"2\n","stderr":"","exit_code":0}}
🛡️ 安全加固建议
- 资源限制
在docker-compose.yml
中追加:environment: - PISTON_RUN_TIMEOUT=5000 # 超时5秒 - PISTON_OUTPUT_MAX_SIZE=10240 # 输出限制10KB - PISTON_MEMORY_LIMIT=134217728 # 内存限制128MB
- 网络隔离
docker network create piston_net docker run ... --network piston_net --restrict-networking
- 系统调用过滤
使用seccomp
配置文件限制危险调用(参考 Piston 安全文档)
❌ 常见问题排查
问题现象 | 解决方案 |
---|---|
容器启动失败 | 检查 --cap-add=SYS_ADMIN 权限 |
下载包超时 | 替换 build.sh 中的下载源为国内镜像 |
执行环境缺失 | 确认 build_package.sh 已运行完成 |
返回结果为空 | 检查 tmpfs 挂载配置是否正确 |
📌 完整自定义指南:
通过此方案,您可在 30 分钟内部署支持 200+ 编程语言的在线代码执行引擎,且通过沙箱隔离保障系统安全。后续可结合 WebSocket 实现实时交互式编程环境。