# 容器与镜像

Muse 中 AI 执行命令的环境称为「容器」，入口在「设置 → 容器与镜像」。列表为单选，选中的容器即 AI 命令执行、文件读写与终端所在的环境。

后端分两类，二者必选其一：**本地容器**（在手机上运行 Linux 系统）与**远程 SSH**（在远程服务器上运行，见[远程 SSH 模式](https://aicode.murk.top/md/guide/remote-ssh.md)）。

## 容器列表

每行是一个容器配置，名称后附来源标记：内置、自定义、SSH。当前生效的那个容器，名称显示为主题色。

以下操作对各类容器均适用：

- **排序**：长按行的名称区域上下拖动可调整顺序（重启后保持）；新添加的容器排在列表最前。
- **编辑**：行尾铅笔图标。
- **重置**：编辑弹窗右上角刷新图标。此为破坏性操作，会删除容器内已安装的工具与配置，需二次确认；确认后正在运行的 AI 会话与所有终端标签都会关闭。内容较多的大型容器删除可能耗时数十秒，期间显示「正在清理容器数据」及已清理项数，完成后自动关闭，界面不阻塞。
- **删除**：行上左滑露出红色删除按钮。删除本地镜像会一并清理其 rootfs 释放空间（同样显示清理进度）；删除远程 SSH 仅删除配置，不影响服务器数据。

内置 Alpine 也可删除。全部删除后列表显示空态，可一键恢复内置 Alpine，无需担心误删。

容器运行后，App 会自动识别其系统类型，在列表左侧显示对应图标（支持 Alpine、Ubuntu、Debian、CentOS），无法识别则显示默认图标。

## 内置 Alpine 容器

App 自带 Alpine 镜像，首次启动时自动加入列表并选中，shell 路径已自动配置，无需额外设置。

::: tip 首次使用需进入终端完成初始化
本地容器的环境准备（解压 rootfs 及安装基础工具）在首次进入**终端页面**时触发。首次使用请先进入终端完成初始化，之后 AI 命令执行、Git 管理与本地 MCP 才能正常使用。
:::

::: info 内置容器的版本不会随 App 升级被替换
新版本 App 可能内置了更新的 Alpine 镜像，但**升级 App 不会动你已经在用的容器**——你在里面装的工具、软件源配置都会原样保留。

想换到新版基线，请在「容器与镜像」里对该容器点**重置**：重置会删除它的 rootfs 目录（含容器内已安装的工具与配置），下次进终端重新解压并初始化。**工作区文件与 AI 配置（skill、MCP）不会受影响**——它们存放在容器之外。新装的 App 首次初始化则直接使用内置的最新镜像。
:::

## 首次进终端的初始化菜单

无论内置 Alpine 还是自行导入的镜像，rootfs 解压完成后首次进入终端都会弹出初始化菜单，含四个选项：

**1. 自动安装依赖（推荐）**

列出待装项（bash、curl、ripgrep、git 等基础工具，以及 Node.js 和 Python 3），输入 `y` 确认后选择软件源并开始安装。

**2. 环境安装**

打开「环境安装」菜单，按场景选择开发环境（见下节）。场景是一组运行时的组合，选定后确认清单即可安装；菜单中也提供「自定义安装」，可逐项勾选并指定主版本。

**3. 手动安装（不再提示）**

跳过安装，此后进入终端不再弹出该菜单，工具自行安装。如需恢复菜单，重置容器即可。

**4. 退出**

本次不安装，下次进入终端仍会提示。

安装失败不影响进入 shell，重新进入终端可再次尝试。

### 软件源选择

换源时可选择：

- `1) 自动探测（推荐）`：实测各镜像源在当前包管理器下的可达性，自动跳过失效或被墙的源。
- `2~6)` 指定镜像源：华为云、清华 tuna、中科大 ustc、腾讯云、阿里云。
- `0)` 不换源，保持默认。

换源前会备份原配置，失败自动恢复，不影响后续安装。内置 Alpine 的 rootfs 保持官方源，需要国内源时在此菜单切换。

## 随时安装开发依赖（muse）

初始化菜单仅在首次进入终端时弹出一次。之后如需安装其他运行时（例如 Java 或 Go），在终端执行命令 `muse` 即可打开「环境安装」菜单。

`muse` 按场景安装，选定场景并确认清单即可：

| 场景 | 安装内容 |
| --- | --- |
| 通用开发 | 基础工具 + Node.js + Python 3 |
| Python 开发 | 基础工具 + Python 3 + pip |
| Node.js / 前端开发 | 基础工具 + Node.js + npm |
| Kotlin / Android 开发 | 基础工具 + JDK 17 + Android SDK |
| Flutter 开发 | 基础工具 + JDK + Android SDK + Flutter SDK |
| Java 开发 | 基础工具 + JDK |
| Go 开发 | 基础工具 + Go |
| Rust 开发 | 基础工具 + rustc + cargo |
| PHP 开发 | 基础工具 + PHP + Composer |
| 仅基础工具 | bash、curl、ripgrep、git |

基础工具（bash、curl、ripgrep、git）在任何场景下都会安装。场景默认安装软件仓库的最新主版本；如需指定版本，使用菜单中的「自定义安装」逐项勾选。菜单中还支持单独换软件源、查看已安装的运行时。

「Kotlin / Android 开发」与「Flutter 开发」属重场景：会从国内镜像下载 JDK、Android SDK（含 build-tools、platform-tools）及 Flutter SDK，耗时较长、占用存储较多。建议在 Debian / Ubuntu 镜像中安装（内置 Alpine 因使用 musl libc 需额外处理）；ARM64 设备会自动替换为可执行的 aapt2 等原生二进制。ARM64 容器可直接构建 Flutter debug APK，release 包需额外补装转译工具，见《在容器中构建 Flutter release APK》。安装完成后，新开终端会自动带上 `JAVA_HOME`、`ANDROID_HOME` 等环境变量，具体编译步骤见「进阶教程」中的《在容器中编译 Android 应用》《在容器中编译 Flutter 应用》。

终端右上角的设置图标打开终端设置面板，可调整配色主题、字号、字体与光标样式。

## 自定义镜像

内置 Alpine 可满足多数场景。如需 Debian / Ubuntu，或预装特定工具链的环境，可自行添加镜像，有两种方式。

### 方式一：内置镜像下载（推荐）

1. 打开「设置 → 容器与镜像」，点击右上角下载图标。
2. 页面列出可下载的镜像（Alpine、Ubuntu、Debian 等），点击一行查看详情并下载。
3. 右上角可切换下载源（官方源 / 华为云 / 阿里云 / 腾讯云），国内网络建议选国内源。
4. 下载完成后点击「导入」，镜像加入容器列表，选中即可使用。

已下载的镜像可重复导入；左滑可删除已下载的镜像文件。

下载页右上角的「多选」按钮（方框带勾的图标）可一次清理多个下载文件：进入多选后每行左侧出现勾选框，顶部操作条给出「全选 / 取消全选」与删除按钮，确认后选中的镜像文件一并删除（已导入的容器将无法再从这些文件解压，但已解压好的容器不受影响）。只有**已下载且文件存在**的条目能勾选，未下载的勾选框是灰的。

**版本信息会自动更新**：列表中的版本号由上游发布信息刷新，上游放出新补丁后不用等 App 更新就能看到，断网时则使用内置的版本清单。因此：

- **点进详情能看到精确版本**：Debian 这类「只写主版本」的发行版，详情里会显示实际补丁号（如 `12.15`），与真正下载到的内容一致。
- **支持状态角标分三档**：`即将停止支持` 表示某个支持期 30 天内结束（如 Alpine 3.21 于 2026-11-01 停止维护）；`已进入 ESM / LTS 延长支持` 表示常规支持已结束、但上游的延长支持计划仍在提供安全更新（Ubuntu 20.04 走 ESM、Debian 12 走 LTS）；`已停止支持` 表示连延长支持期也结束了。**点进详情能看到两个支持期的确切日期**，据此判断还能用多久。三档都能照常下载，只是建议优先选常规支持期内的分支。
- **已经下载过的镜像出现「有新版可下载」**：说明上游发布了新补丁（常见于安全修复）。重新下载再导入即可，旧的下载文件可左滑删除。升级到本版本前下载的镜像也能识别——版本号从下载文件名里取，不需要重新下载一次才知道有新版。
- **下载会自动校验完整性**：Alpine 与 Ubuntu 的镜像带官方 SHA-256，下载完会核对，不一致会提示校验失败并删除半成品；Debian 的上游只提供构建产物、没有校验和，因此不校验。
- **腾讯云源只提供 Alpine**：其 Ubuntu 镜像长期未同步补丁版本，因此该源下 Ubuntu 会显示「当前源暂无此镜像」，切回官方源或华为云 / 阿里云即可。

### 方式二：手动导入镜像文件

需要特定版本或发行版时，可自行准备 rootfs 镜像导入。

**镜像要求**：

- 压缩格式：`.tar.gz`、`.tgz`、`.tar.xz`、`.txz`
- 内容须为完整的 Linux rootfs（文件系统根目录，包含 `/bin/sh` 或其它 shell）
- 架构须与设备匹配：ARM64 设备用 aarch64 镜像，x86 设备用 x86_64 镜像

**镜像来源**：

- Alpine（体积小、启动快）：`https://alpine.linuxhub.cn/alpine/edge/releases/`，在 aarch64 目录下选 `alpine-minirootfs-*-aarch64.tar.gz`
- Ubuntu：`https://cdimage.ubuntu.com/ubuntu-base/releases/`，选 `ubuntu-base-*-base-arm64.tar.gz`
- Debian：可从 Docker Hub 官方镜像（如 `arm64v8/debian`）导出

具备 Docker 环境时，可从任意镜像导出 rootfs：

```bash
docker pull debian:bookworm
docker create --name temp-rootfs debian:bookworm
docker export temp-rootfs | gzip > debian-rootfs.tar.gz
docker rm temp-rootfs
```

也可在已有 Linux 环境中用 `debootstrap`（Debian / Ubuntu）或 `alpine-make-rootfs`（Alpine）自行制作。

**导入步骤**：

1. 打开「设置 → 容器与镜像」，点击右上角 +，选「本地镜像」。
2. 填写配置：
   - **名称**：镜像配置的别名。
   - **shell 路径**：容器内 shell，如 `/bin/sh` 或 `/bin/bash`。
   - **镜像文件**：选择准备好的 rootfs 文件。保存时会复制一份到 App 私有目录，此后重置容器均从该副本重新解压，不依赖原始文件；删除镜像时副本一并清理。
   - **挂载**（可选）：将手机目录挂进容器，见下文「把手机目录挂给 AI 用」。
   - **proot 参数**（可选）：逐项添加，原样追加到 PRoot 启动参数。
   - **环境变量**（可选）：注入容器内进程的键值对。
3. 保存后在列表中选中该配置，即切换为自定义容器。

首次使用自定义镜像时 App 会解压 rootfs 到私有目录，耗时取决于镜像大小。自定义镜像默认不配置国内软件源，可在首次进入终端的初始化菜单中切换。

### 常见问题排查

**安装软件报错**：由容器内硬链接不可用导致。编辑镜像 → proot 参数 → 添加 `--link2symlink` → 保存，重新进入终端。使用内置下载功能导入的镜像已默认带有该参数。

**方向键显示为 `^[[A`**：当前 shell 为 `sh`，不支持行编辑。编辑容器，将 Shell 改为 `/bin/bash`，即可获得方向键、历史记录与补全。

## 把手机目录挂给 AI 用

AI 运行在容器内，默认只能看到工作区，无法访问手机公共存储。如需访问，需将手机目录挂进容器：

1. 确认存储权限已授权。首次使用时会弹出权限请求；若此前拒绝过，前往系统设置 → 应用 → Muse → 权限 → 存储 开启。
2. 打开「设置 → 容器与镜像」，编辑当前使用的容器。
3. 在「挂载」中添加一条：**本地目录**填手机上的路径（如 `/sdcard/Download`），**容器目录**填容器内路径（如 `/mnt/Download`）。
4. 保存后重启终端会话，AI 即可通过容器内路径访问。

::: warning 按需挂载
仅挂载需要的子目录，不要直接挂载整个 `/sdcard`——那会将手机中所有文件暴露给 AI，存在隐私泄露风险。
:::

例：如需让 AI 查看 App 日志，将本地目录 `/storage/emulated/0/Android/data/com.muse/` 挂到容器 `/mnt/muse`，即可读取 `/mnt/muse/files/logs/` 下的日志。注意 `Android/data/` 下只能访问 Muse 自身的目录，其他应用的目录受分区存储限制无法访问。

如需处理的仅为单个文件，更简便的方式是将其复制进工作区，AI 默认即可访问。

## 全部删除后的行为

即使删除所有容器（包括内置 Alpine），App 仍可正常使用——AI 执行命令时会回退到内置 Alpine 作为默认执行环境。重新打开「容器与镜像」页，可在空状态页面一键恢复内置 Alpine 或添加新镜像。
