Hello World
本教程带你用一个最简单的 Hello World 应用,跑通 NE503 容器应用的完整生命周期:编写应用 → 构建 ARM64 镜像 → 上传部署 → 启动 → 在 Web 控制台验收 → 查看日志 → 清理。掌握这个最小闭环后,你就能快速迭代任何 AI 应用。
Hello World 不依赖 AI SDK,只在一个循 环里持续打印计数,适合用来验证开发环境与部署流程是否打通。
1. 前置条件
| 条件 | 验证方法 |
|---|---|
| NE503 设备已联网并运行 | 浏览器访问 http://<设备IP>:8080,能看到 Web 登录页 |
| 开发机已安装 Docker | 终端执行 docker --version,版本 >= 20.10 |
| 开发机能 ping 通设备 | curl -o /dev/null -w "%{http_code}" http://<设备IP>:8080 返回 200 |
| 知道设备登录凭据 | Web 控制台默认 admin / password(首次登录后请修改) |
NE503 设备是 ARM64 架构。如果你的开发机是 Apple Silicon(M 系列芯片),同样 是 ARM64,可以原生构建,速度快;如果是 x86 机器,Docker buildx 会自动用 QEMU 模拟,稍慢但同样可用。
2. 应用结构
Hello World 应用由三个文件组成(完整源码在仓库 apps/hello-world/):
hello-world/
├── app.py # 应用主逻辑
├── app.yaml # 应用清单(资源/权限/配置)
└── Dockerfile # 容器构建定义
app.py —— 纯 Python,循环打印带计数的信息,并响应 SIGTERM 优雅退出(平台停止应用时会发 SIGTERM):
import os, time, signal
class HelloWorldApp:
def __init__(self):
self.running = True
self.app_id = os.environ.get("APP_ID", "hello_world") # 平台注入
self.counter = 0
signal.signal(signal.SIGTERM, self._signal_handler)
def _signal_handler(self, signum, frame):
self.running = False
def run(self):
while self.running:
self.counter += 1
print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] #{self.counter:06d} - Hello World from AIPC!")
time.sleep(1)
if __name__ == "__main__":
HelloWorldApp().run()
app.yaml —— 应用清单,声明镜像、资源限制与启动策略(Hello World 不需要任何权限):
apiVersion: v1
kind: Application
metadata:
id: hello-world
name: Hello World
version: 1.0.0
description: A simple hello world application that prints continuously
spec:
image: aipc/hello-world:1.0.0 # 必须与 docker build -t 的 tag 一致
resources:
cpu: "10%"
memory: "32Mi"
autostart: false
restart_policy: on-failure
restart_max_retries: 3
Dockerfile —— 基于 python:3.11-alpine,体积小:
FROM python:3.11-alpine3.19
WORKDIR /app
COPY app.py /app/app.py
ENV PYTHONUNBUFFERED=1
ENV APP_ID=hello_world
CMD ["python3", "/app/app.py"]
3. 构建镜像
在应用目录下构建 ARM64 镜像,导出为 tar,再打包成 .aipc 安装包:
cd apps/hello-world
# 1. 构建 ARM64 镜像(--load 载入本地 Docker)
docker buildx build --platform linux/arm64 --load -t aipc/hello-world:1.0.0 .
# 2. 导出镜像为 tar
docker save aipc/hello-world:1.0.0 -o image.tar
# 3. 打包成 .aipc(app.yaml + image.tar 的 zip)
zip hello-world.aipc app.yaml image.tar
构建产物(真实):
| 产物 | 大小 |
|---|---|
| Docker 镜像 | 26.5 MB(磁盘占用 113 MB) |
image.tar | 25 MB |
hello-world.aipc | 25 MB |
.aipc只是app.yaml+image.tar的 zip 归档包,便于保存和分发。部署到设备时用的是里面的image.tar和app.yaml两个文件(见下节),.aipc本身不参与 API 上传。
在 macOS + Docker Desktop 上,apk add 偶尔报 Failed to create ...: I/O error。这是 buildx 的已知偶发问题,重新执行一次构建命令即可成功。
4. 部署到设备
应用构建完成后,手上有 app.yaml(应用清单)和 image.tar(容器镜像)两个文件。下面提供三种部署方式,推荐用 Web 控制台——图形界面、所见即所得,无需 SSH。
下面三种方式都需要 app.yaml 和 image.tar 两个独立文件。按本教程 §3 的手动步骤构建后,这两个文件都在应用目录里。如果你用的是仓库 apps/<app>/build.sh(它会在打包 .aipc 后删掉中间的 image.tar),请先解压:unzip -o <app>.aipc。