镜像固化
本章讨论一个经常被问到的问题:能不能把容器运行后的状态“固化“成一个新的镜像,下次直接启动就能恢复?
答案是不能直接做到,但有更好的替代方案。本章解释为什么,以及正确的做法。
1. 为什么不能直接固化运行状态为镜像
容器镜像的本质
容器镜像(Container Image)由多层只读的文件层叠加而成:
graph TB
subgraph IMAGE_LAYERS["镜像层 - 只读,构建时确定"]
L1["基础层:操作系统 + Python"]
L2["应用层:agentcore 代码"]
L3["配置层:默认配置文件"]
end
subgraph RUNTIME_LAYER["运行时层 - 可写,容器存活期间"]
RW["运行时写入:checkpoint、缓存、临时文件"]
end
L1 --- L2 --- L3 --- RW
关键区别:
- 镜像层:构建时通过 Dockerfile 确定,所有容器共享,不可修改
- 运行时层:容器启动后产生的文件修改,仅存于内存/临时存储,容器销毁后消失
为什么 docker commit 不可行
虽然 Docker 提供了 docker commit 命令可以把运行时层“拍照“成新镜像,但在 K8s/K3s 环境下这条路不可行:
| 原因 | 说明 |
|---|---|
| K3s 中没有 docker commit 等效操作 | K3s 使用 containerd 作为运行时,不直接暴露此功能 |
| 运行时状态不断变化 | SessionWorker 容器在运行中持续处理请求,快照时机难以确定 |
| 状态不可预测 | 每次运行产生的文件不同,固化后的镜像难以复用 |
| 镜像膨胀 | 每次运行都生成新镜像,存储成本不可控 |
| 安全风险 | 运行时镜像可能包含凭据等敏感信息 |
2. 正确的替代方案
方案一:Backend 管理的状态持久化(当前推荐)
通过 Backend 统一持久化状态,不依赖把运行状态固化进镜像:
graph LR
subgraph "第一轮 Run"
R1[agentcore] -->|checkpoint_put| B1["Backend"]
end
subgraph DATA_SIDE["数据层"]
HOST["Backend 数据库"]
end
subgraph "第二轮 Run"
B2["Backend"] -->|checkpoint_get_result| R2[agentcore]
end
B1 -.->|写入| HOST
HOST -.->|读取| B2
优势:状态权威来源集中在 Backend,容器内不需要直接持有数据库连接或数据库文件。
方案二:预热镜像(Prewarmed Image)
将不变的基础环境和依赖预先打包到镜像中,减少每次运行的初始化时间:
graph TB
subgraph BUILD_PHASE["构建时 - 开发者操作"]
BASE["基础镜像<br/>Python + 基础库"]
DEP["安装 Agent 依赖<br/>pip install xxx"]
MODEL["预下载模型文件"]
IMG["预热镜像<br/>registry/agent-prewarmed:v1"]
end
BASE --> DEP --> MODEL --> IMG
subgraph RUN_PHASE["运行时"]
POD["容器启动"]
FAST["跳过安装步骤<br/>直接开始执行"]
end
IMG -->|拉取| POD
POD --> FAST
适用场景:
- Agent 依赖大型 Python 库(如 PyTorch、Transformers)
- Agent 需要预下载模型文件
- 需要减少冷启动时间
操作方式:Agent 包开发者编写自定义 Dockerfile,在 RuntimeProfile 中指定预热镜像地址。
方案三:镜像层缓存
让 K3s 节点缓存常用的基础镜像层,避免每次运行都从 Registry(镜像仓库)拉取:
| 策略 | 说明 |
|---|---|
| imagePullPolicy: IfNotPresent | 本地已有的镜像层不重复拉取 |
| 镜像预拉取 | 在节点上提前拉取常用镜像 |
| 本地 Registry | 在集群内部署镜像缓存代理 |
3. 推荐实践
| 需求 | 推荐方案 | 原因 |
|---|---|---|
| 多轮对话状态保持 | Backend 管理的 checkpoint 持久化 | 权威状态集中,恢复路径更清晰 |
| 减少冷启动时间 | 预热镜像 + imagePullPolicy | 平衡复用性和灵活性 |
| 大型依赖环境 | 预热镜像(包含所有依赖) | 避免每次运行重复安装 |
| 共享运行环境 | 统一基础镜像 + Agent 包分层 | 基础镜像共享,Agent 逻辑通过 ConfigMap 注入 |
4. 技术可行性总结
| 技术路线 | 可行性 | 复杂度 | 推荐度 |
|---|---|---|---|
| docker commit 式快照 | ❌ 不可行 | — | 不推荐 |
| Backend 管理的 checkpoint | ✅ 推荐 | 中 | ⭐⭐⭐ 强烈推荐 |
| 预热镜像 | ✅ 可行 | 中 | ⭐⭐ 推荐 |
| OCI 镜像层缓存 | ✅ 可行 | 低 | ⭐⭐ 推荐 |
| 容器快照(CRIU) | ⚠️ 实验性 | 高 | 不推荐 |
下一步
了解了镜像策略后,请继续阅读 AgentCore 通信机制。