Skip to main content

容器快照

容器快照

概览

本教程演示了如何使用互联网计算机 (IC) 的容器快照功能。

当容器因未按预期工作、陷入陷阱等原因需要回滚到之前的版本,开发人员可以使用容器快照。一个容器包含编译后的 Wasm 代码和数据(例如容器 ID、配置和 Wasm 内存等),开发人员可以对已停止的容器进行快照,以保存当前的稳定内存、堆内存、数据和 Wasm 模块等信息。该快照可以在后期进行加载、以将容器回滚到快照中所保存的状态。

info

容器快照在 dfx 版本 0.23.0 及更新版本中得到支持。

创建快照

在创建快照之前必须停止容器,然后使用以下命令创建快照:

dfx canister stop <canister-name>
dfx canister snapshot create <canister-name>

只有容器的控制者才可以创建快照或将容器回滚至快照。

该命令会返回容器的快照 ID 如下:

Created a new snapshot of canister hello_backend. Snapshot ID: 0000000000000000800000000010000a0101

该快照 ID 可用于以后加载快照。

如果您需要列出某个容器保存的所有快照,使用以下命令:

dfx canister snapshot list <canister-name>

该命令将返回快照 ID、快照大小以及快照创建的时间戳。

0000000000000000800000000010000a0101: 2.39MiB, taken at 2024-09-16 19:40:23 UTC

加载快照

在加载已保存的容器快照之前必须停止容器,然后使用以下命令加载快照:

dfx canister stop <canister-name>
dfx canister snapshot load <canister-name> <snapshot-id>

加载容器快照将使用快照中的代码和数据替换容器当前的代码和数据。容器快照创建后新增到容器的任何数据都将被删除。

删除快照

请使用以下命令删除已保存的容器快照:

dfx canister snapshot delete <canister-name> <snapshot-id>

如果您需要在 IC 主网上操作容器快照,请在上述相关命令中添加 --network ic 选项。

要求

进入工程

在完成 Clone 示例仓库之后,执行如下命令:

cd examples/rust/canister-snapshots

本地部署

完成代码更新后,您可以执行以下脚本将您的容器部署到 IC 的本地开发环境。

dfx start --background
dfx deploy

如果成功,您将会看到类似如下的输出信息:

...
Deployed canisters.
URLs:
Backend canister via Candid interface:
chat: http://127.0.0.1:4943/?canisterId=a3shf-5eaaa-aaaaa-qaafa-cai&id=asrmz-lmaaa-aaaaa-qaaeq-cai
...

写入数据

您可以执行以下命令来更新容器数据:

dfx canister call chat append 'Hi there!'
dfx canister call chat dump

输出如下:

dfx canister call chat append 'Hi there!'
()
dfx canister call chat dump
(vec { "Hi there!" })

创建快照

您可以执行以下命令来创建快照:

dfx canister stop chat
dfx canister snapshot create chat
dfx canister start chat

输出如下:

dfx canister stop chat
Stopping code for canister chat, with canister_id bkyz2-fmaaa-aaaaa-qaaaq-cai
dfx canister snapshot create chat
Created a new snapshot of canister chat. Snapshot ID: 000000000000000080000000001000010101
dfx canister start chat
Starting code for canister chat, with canister_id bkyz2-fmaaa-aaaaa-qaaaq-cai

您可以执行以下命令查看容器快照:

dfx canister snapshot list chat

删除数据

示例容器 chat 提供了 remove_spam 方法来删除数据、用以模拟数据丢失。

dfx canister call chat remove_spam
dfx canister call chat dump

输出如下:

dfx canister call chat remove_spam
(0 : nat64)
dfx canister call chat dump
(vec {})

加载快照

您可以执行以下命令从容器快照恢复数据:

dfx canister stop chat
dfx canister snapshot list chat
dfx canister snapshot load chat 000000000000000080000000001000010101
dfx canister start chat
dfx canister call chat dump

输出如下:

dfx canister stop chat
Stopping code for canister chat, with canister_id bkyz2-fmaaa-aaaaa-qaaaq-cai
dfx canister snapshot list chat
000000000000000080000000001000010101: 1.61MiB, taken at 2024-08-27 18:19:20 UTC
dfx canister snapshot load chat 000000000000000080000000001000010101
Loaded snapshot 000000000000000080000000001000010101 in canister chat
dfx canister start chat
Starting code for canister chat, with canister_id bkyz2-fmaaa-aaaaa-qaaaq-cai
dfx canister call chat dump
(vec { "Hi there!" })

这里您可以看到我们成功的从容器快照中恢复了丢失的数据。

以上教程展示了最基本的容器快照用法。容器快照是为开发者提供的一个强大的新工具。在发生意外数据丢失、漏洞或配置错误时,容器可以快速恢复到之前的正常状态。它有助于确保关键数据和服务在面对意外事件时仍然可访问,为开发者提供了安心保障。

有问题么?

欢迎大家随时向我们提出任何技术问题。我们会尽力尽快回应

  1. 上网比较方便的,在 ICP China 的 Twitter Community,用中文发帖提问

  2. 有经验的开发者在 DFINITY 基金会运营的开发者论坛上用英文提问

    info

    https://forum.dfinity.org/ ,可以 cue 我们:BenPaulVincentHerbert

  3. 深度 ICP 用户可以在 OpenChat 上的 IC123.xyz Community 里的频道 ic123.xyz 工作组 里提问题

    欢迎您申请 DFINITY 基金会的 Developer Grant 项目,加入互联网计算机的大家庭!