---
summary: "使用主机模式 devcontainer 文件声明云项目设置和生命周期命令"
title: "云环境文件"
read_when: "您需要存储库定义的云会话设置或启动命令。"
doc-schema-version: 1
---
提交 `.devcontainer/devcontainer.json` 以自定义存储库准备和启动。 OpenClaw 支持 Dev Container 规范的主机模式子集:命令在准备好的工作空间中以工作用户身份直接在云计算机上运行。它不会启动容器。
## 配方优先级
OpenClaw 从已承认的 Git 提交中选择一个配方,按以下顺序:
1. `.devcontainer/devcontainer.json`.
2. `.devcontainer.json` 位于存储库根目录。
3. 可执行文件`.openclaw/worktree-setup.sh`。
4. 内置JavaScript锁定文件检测。
Devcontainer 文件接受 JSONC 注释和尾随逗号。即使声明的文件不包含命令,它也会获胜;无效文件会报告错误而不是回退。未提交的配方不会进入共享快照。存储库命令需要管理员授权设置;显式跳过安装使用单独的快照标识。本地托管工作树保留其现有的设置行为。
## 生命周期和快照
| 属性 | 运行时间 | 被俘虏了? |
| ---------------------- | ----------------------------------------------------------- | ------------------ |
| `onCreateCommand` | 初始结帐准备,`updateContentCommand` 之前 | 文件系统结果 |
| `updateContentCommand` | 新提交的初始准备和就地刷新 | 文件系统结果 |
| `postCreateCommand` | 注册后,第一个会话绑定到每个工作人员 | No |
| `postStartCommand` | 绑定时,`postCreateCommand`(如果存在)之后 | No |
在同一提交中经过验证的签出会跳过准备命令。在提交刷新时,仅 `updateContentCommand` 重新运行;后备脚本和检测到的安装程序重新运行以进行自己的刷新。绑定后命令在首次打开冷机和快照分叉之前运行。唤醒空闲回收的会话会配置另一个工作线程并再次运行它们。没有用于任意外部重新启动的钩子。
每个命令接受一个 shell 字符串、一个可执行文件和参数数组或一个其命名命令并行运行的对象。一个阶段中的所有命令都必须成功。使声明的命令具有幂等性,因为中断的首次绑定可以重试它们。
`containerEnv` 和 `remoteEnv` 为生命周期命令提供文字、非秘密字符串。 `remoteEnv` 覆盖匹配的 `containerEnv` 密钥; `null` 远程值删除变量。这些值扩展了最小设置环境,并且不会传播到会话进程。不支持变量替换。
## 最小示例
```jsonc
{
"updateContentCommand": ["npm", "ci"],
"postCreateCommand": "npm run build",
"postStartCommand": "npm run dev > /tmp/project-dev.log 2>&1 &",
"remoteEnv": { "NODE_ENV": "development" },
}
```
依赖安装在快照中是可重用的。构建和服务器在绑定后启动,因此它们可以看到会话内容。将进程启动放在 `postStartCommand` 中:快照保留文件系统状态,而不是正在运行的进程。
## 忽略的属性
录制的注释将忽略不支持的属性。其中包括 `image`、`build`、`dockerComposeFile`、`runArgs`、`mounts`、`remoteUser`、`features`、`hostRequirements` 和 `customizations`。 OpenClaw 不安装开发容器功能。请参阅上面的 [ 支持的字段 ](/gateway/cloud-workers/environment-file#lifecycle-and-snapshots) 和下面的 setup-secret 请求,而不是假设完整的 [Dev 容器规范 ](https://containers.dev/implementors/json_reference/) 适用。
## 内置检测
如果没有 devcontainer 文件,可执行文件 `.openclaw/worktree-setup.sh` 在捕获之前运行。两者都没有,OpenClaw 使用第一个匹配的锁定文件:
| 锁文件 | 准备 |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `pnpm-lock.yaml` | 启用用户可写的 Corepack 垫片,然后 `pnpm install --frozen-lockfile` |
| `yarn.lock` | 启用用户可写的 Corepack 垫片,然后启用 Berry 的 `yarn install --immutable` 或 Classic 的 `--frozen-lockfile` |
| `package-lock.json` | `npm ci` |
| `bun.lock` or `bun.lockb` | `bun install --frozen-lockfile`,或者当 Bun 不存在时跳过并注释 |
Yarn的`packageManager`专业选择Berry(2+)或Classic;如果没有它,`.yarnrc.yml` 选择 Berry。没有可识别的锁定文件意味着没有依赖项设置。检测本身不安装Node或Bun; Linux [工具链引导程序](/gateway/cloud-workers/setup-and-bundle-installation#automatic-linux-node-toolchains)单独提供Node。
检测到 pnpm 和 Yarn 安装会抑制 Corepack 的下载提示,并且不会在 `package.json` 中自动固定 `packageManager`。
检测到失败的安装会记录原因和有限的输出,跳过该运行的捕获,并让会话冷启动。声明失败的命令或后备脚本会停止调度。更改配方会改变快照兼容性;参见[温馨图片](/gateway/cloud-workers/warm-images)。
## 设置秘密
devcontainer `secrets` 映射最多可以请求 16 个 POSIX 环境名称,以及可选的 `description` 和 `documentationUrl` 元数据。例如,`"secrets": { "NPM_TOKEN": { "description": "Private registry access" } }` 从所选配置文件的运营商批准的 `settings.setupSecrets` 地图中请求 `NPM_TOKEN`。存储库无法选择存储条目、值或目标;未映射的名称在命令运行之前会失败。
[在网关上配置设置机密](/gateway/config-cloud-workers#setup-secrets)。配置文件设置、存储库准备和 create/start 后命令接收不透明占位符。受保护的出口仅替换每个机密的绑定 HTTPS 主机的凭证。批准的秘密和代理设置会覆盖文字配方环境值。
这需要协调器拥有的 Linux 租约、用于受保护存储库准备的已知机器类以及 Crabbox 的本机出口助手。不可用的支持明显失败,没有明文回退。当生命周期命令完成时访问结束,因此分离的服务器无法保留它。秘密不会禁用快照。