概述
如果您需要在同一沙箱实例中运行自己的服务(例如自定义 API、数据处理进程),可以通过扩展AIO(Base、Code Interpreter)等基础镜像的方式实现。
本文以一个简单的 Python Echo Server 为例,介绍如何将自定义服务集成到AIO沙箱中。
操作步骤
文件结构 新建一个项目目录,例如echoserver,按以下结构组织文件:
echoserver/
└── server
└── echo_server.py
└── config/
└── echo_server.conf
└── Dockerfile步骤一:编写服务代码
创建 echo_server.py,实现一个简单的 HTTP 服务,GET 请求返回ok:
#!/usr/bin/env python3
import os
from http.server import HTTPServer, BaseHTTPRequestHandler
DEFAULT_PORT = 9000
class EchoHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-Type', 'text/plain; charset=utf-8')
self.end_headers()
self.wfile.write(b'ok\n')
def main():
port = int(os.environ.get('ECHO_SERVER_PORT', DEFAULT_PORT))
host = os.environ.get('ECHO_SERVER_HOST', '0.0.0.0')
server = HTTPServer((host, port), EchoHandler)
print(f"[echoserver] Starting echo server on {host}:{port}")
try:
server.serve_forever()
except KeyboardInterrupt:
server.shutdown()
if __name__ == '__main__':
main()步骤二:编写配置文件
配置统一使用supervisor管理,创建echo_server.conf,配置服务的启动命令、重启策略、日志等:
# ====================================================================
# Echo Server Supervisor 配置文件
# ====================================================================
# ===========================
# 程序定义部分
# ===========================
[program:echo_server]
command=/usr/bin/env python3 /home/user/server/echo_server.py
# 工作目录
directory=/home/user
# 执行用户和组
user=user
# ===========================
# 自动管理与重启策略
# ===========================
# 是否自动启动
autostart=true
# 自动重启策略
autorestart=unexpected
# 启动重试次数
startretries=3
# 启动成功检查时间
startsecs=5
priority=999
# ===========================
# 日志配置
# ===========================
# 标准输出日志文件
stdout_logfile=/var/log/supervisor/echo_server/access.log
# 标准错误日志文件
stderr_logfile=/var/log/supervisor/echo_server/error.log
# 日志文件大小限制
stdout_logfile_maxbytes=50MB
stderr_logfile_maxbytes=50MB
# 日志文件备份数量
stdout_logfile_backups=10
stderr_logfile_backups=10步骤三:编写Dockerfile
创建Dockerfile,这里以AIO作为基础镜像,将服务代码和配置文件复制到对应目录:
FROM serverless-public-registry.crs-huanan2.ctyun.cn/sandbox/ctyun-aio:v1.1
USER root
# 拷贝自己应用supervisord的配置文件到容器
COPY conf/echo_server.conf /etc/supervisor/conf.d/echo_server.conf
RUN chmod 644 /etc/supervisor/conf.d/echo_server.conf
# 创建echo_server输出的日志目录
RUN mkdir -p /var/log/supervisor/echo_server
# 设置应用要用的环境变量
ENV ECHO_SERVER_HOST=0.0.0.0 \
ECHO_SERVER_PORT=9000
# 拷贝自己的应用到容器
COPY ./server /home/user/server
RUN chmod 777 -R /home/user
USER user其他基础镜像地址:
serverless-public-registry.crs-huanan2.ctyun.cn/sandbox/ctyun-base:v1.1
serverless-public-registry.crs-huanan2.ctyun.cn/sandbox/ctyun-code-interpreter:v1.1
serverless-public-registry.crs-huanan2.ctyun.cn/sandbox/ctyun-aio:v1.1
步骤四:构建并测试
docker build --platform linux/amd64 -t echo-server:v0.1 . -f Dockerfile
docker run -d \
-p 9000:9000 \
echo-server:v0.1
# 验证
curl http://127.0.0.1:9000
# 预期返回: ok步骤五:推送镜像
将构建出来的镜像,推送到天翼云容器镜像服务CRS,后续创建自定义模板可从CRS里选择该镜像。
步骤六:创建自定义模板
进入控制台->创建沙箱模板,沙箱类型选择“自定义沙箱”,并选择上一步上传的镜像。
注意事项
端口冲突:自定义服务的内部端口不能与 AIO 内置服务冲突。AIO 内置服务端口:
沙箱管理代理envd:49983
Code Interpreter:49999、8888
BrowserTool:9223、9222
VncTool:6080、5900