# 缓存
<subtitle>缓存流程的工作原理</subtitle>

缓存概念类似于 [Docker 的层缓存](https://docs.docker.com/build/cache/)。对于每个层命令（`.copy()`、`.run_cmd()`、`.set_envs()` 等），我们在现有层之上创建一个新层。每个层都根据命令及其输入（例如，复制的文件、执行的命令、设置的环境变量）进行缓存。如果层命令未更改且其输入与之前任何构建中的输入相同，我们会重用缓存的层而不是重新构建它。

这大大加快了构建过程，特别是对于具有许多层的大型模板。缓存的范围限定在团队内，因此即使您有多个模板，如果它们具有相同的层，也可以共享相同的缓存。

## 缓存失效

您可以仅部分失效缓存，也可以对整个模板失效。

### 部分失效

从下一条指令开始强制重建，使用以下方法：

```python
template = (
    Template()
    .from_base_image()
    .skip_cache()
    .run_cmd("echo 'Hello, World!'")
)
```

这将从下一条指令开始强制重建，使模板中所有后续指令的缓存失效。

### 整个模板失效

要强制重建整个模板，还可以在 `Template.build` 方法中使用 `skip_cache` 参数：

```python
Template.build(
    template,
    'my-template',
    skip_cache=True,  # 配置缓存跳过（文件除外）
)
```

这将跳过整个模板构建的缓存使用。

## 文件缓存

使用 `.copy()` 命令时，我们根据文件内容缓存文件。如果文件自上次构建以来未更改，我们会从文件缓存中重用它们。

我们在这里与 Docker 不同。因为我们在我们的基础设施上构建模板，所以我们使用改进的文件级缓存。即使您使 `.copy()` 之前的层失效（例如，通过更改环境变量），我们也会重用已上传的文件。`copy()` 命令仍将重新执行，但该层的文件将从文件缓存中重用，无需再次从您的计算机上传它们。

要使模板中所有后续指令**以及**层文件缓存失效，请使用 `force_upload` 参数。

```python
template = (
    Template()
    .from_base_image()
    .copy("config.json", "/app/config.json", force_upload=True)
)
```

## 缓存的用例

您可以利用缓存创建具有多个变体（例如，不同的 RAM 或 CPU）的模板，同时重用通用层。构建模板时，只需将模板名称更改为特定的 RAM/CPU 配置（例如，`my-template-2cpu-2gb`、`my-template-1cpu-4gb`），保持模板定义的其余部分相同，构建过程将重用缓存的层。

## 优化构建时间

要优化构建时间，请将经常更改的命令（例如，复制源代码）放在模板定义的末尾。这样，早期的层可以更频繁地缓存和重用。
