Meet NanoCo, maintainers of NanoClaw: we raised $12M to give every member of your team a professional assistant →
技能
基础设施 官方

Apple Container — 苹果容器

从 Docker 切换到 Apple Container,实现 macOS 原生容器隔离。更轻量、更快速,专为 Apple Silicon 打造。

功能特性

  • 将 Docker 替换为 Apple 原生容器运行时
  • 在 Apple Silicon 上启动更快、资源占用更低
  • 相同的安全模型——挂载白名单、默认只读、用户隔离
  • 通过容器内的 mount --bind 处理 .env 文件遮蔽
  • 所有接口和 IPC 协议保持不变

前置条件

  • 已安装并运行 NanoClaw(当前使用 Docker)
  • 搭载 Apple Silicon(M1 及以上)的 macOS
  • 已安装 Apple Container

安装

/convert-to-apple-container

工作原理

/convert-to-apple-container 技能将 NanoClaw 的容器运行时从 Docker 切换到 Apple Container——Apple 为 macOS 提供的原生容器技术。此迁移会更改运行时二进制文件、挂载语法和一些内部细节,但其他一切保持不变——你的频道、代理行为、挂载白名单和导出接口均不受影响。

此转换并未捆绑在全新安装中——它以上游仓库上的 skill/apple-container 分支形式分发(参见 docs/BRANCH-FORK-MAINTENANCE.md)。技能通过合并该分支来应用它(git fetch upstream skill/apple-container && git merge upstream/skill/apple-container),这会带来五个更改的文件:

  • src/container-runtime.ts — 主运行时接口,针对 Apple Container 的 API 重写。挂载语法从 Docker 的 -v path:path:ro 改为 --mount type=bind,source=...,target=...,readonly
  • src/container-runner.ts — 移除 Docker 的 /dev/null .env 遮蔽挂载,并以 root 身份启动主组容器,以便入口点可以执行 mount --bind(Apple Container 仅支持目录挂载,不支持 Docker 的文件覆盖方式),随后通过 setpriv 降权。
  • container/Dockerfile — 更新的入口点,处理容器内的 .env 遮蔽。
  • container/build.sh — 默认使用 container 二进制文件而非 docker
  • src/container-runtime.test.ts — 测试更新以适配 Apple Container 行为。

代码更改完成后,使用 ./container/build.sh 重新构建容器镜像并重启服务。切换立即生效。

为什么要切换

Apple Container 是一个为 Apple Silicon 优化的第一方 macOS 运行时。与 Docker Desktop 相比:

  • 启动更快。 容器启动更快,因为没有 Linux 虚拟机层——Apple Container 在 macOS 上原生运行容器。
  • 开销更低。 没有 Docker 守护进程在后台持续消耗内存和 CPU。
  • 技术栈更简单。 少了一个需要安装和维护的依赖。Apple Container 只是一个单独的二进制文件。

代价是 Apple Container 仅支持 macOS,且比 Docker 更新,可能存在边界情况。如果你在 Linux 上运行 NanoClaw,Docker 是唯一选择。

有哪些变化

安全模型保持不变。NanoClaw 的挂载白名单仍然控制代理可以访问哪些目录。容器仍然以非 root 用户(uid 1000)运行。只读挂载仍然是默认设置。

一个内部差异:Apple Container 不支持挂载单个文件,只支持目录。Docker 使用 /dev/null 覆盖来隐藏容器内的 .env 文件(防止代理读取密钥)。Apple Container 通过 mount --bind 遮蔽文件来实现相同效果,这要求容器入口点以 root 身份启动,然后通过 setpriv 降权。最终结果完全一致——代理无法读取 .env——但实现机制不同。

回滚

此更改以合并上游 skill/apple-container 分支的 git merge 形式落地,因此会记录在你的 git 历史中。如果需要切换回 Docker,用 git 回退该合并提交,使用 ./container/build.sh 重新构建容器镜像,然后重启服务。

故障排除

找不到 Apple Container。Apple 容器发布页面 下载,安装 .pkg 文件,然后用 container --version 验证。

运行时无法启动。 运行 container system start,然后用 container system status 检查状态。

镜像构建失败。 Apple Container 的缓存策略较为激进。通常执行清理重建即可解决:container builder stop && container builder rm && container builder start,然后重新运行 ./container/build.sh

容器无法写入挂载目录。 检查宿主机上的目录权限。容器以 uid 1000 运行,因此挂载目录需要对该用户可写。

使用技巧

  • 全新安装默认使用 Docker——设置过程不提供运行时选择。如果你想使用 Apple Container,请在设置完成后运行此转换。
  • Apple Container 和 Docker 可以在同一台机器上共存。将 NanoClaw 切换到 Apple Container 不会影响其他 Docker 工作负载。
  • 容器镜像格式是兼容的,你不需要维护单独的 Dockerfile。