Skip to content

Commit 7f8725d

Browse files
committed
Rephrase caching strategies based on feedback
Incorporating suggestions by @ramiyengar on the phrasing of "Caching Strategies" section. Signed-off-by: Aidan Delaney <[email protected]>
1 parent 5dc1963 commit 7f8725d

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

content/docs/buildpack-author-guide/caching-strategies.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@ In this section we look at caching each layer type.
2222

2323
## Layer Metadata
2424

25-
Buildpacks ensure byte-for-byte reproducibility of layers. File creation time is normalized to January 1, 1980 to ensure reproducibility. Byte-for-byte reproducibility means we can re-use previous layers. However, we want to invalidate previously cached layers if
25+
Buildpacks ensure byte-for-byte reproducibility of layers. File creation time is normalized to January 1, 1980 to ensure reproducibility. Byte-for-byte reproducibility means previous layers can be reused. However, we want to invalidate previously cached layers if
2626

2727
* the buildpacks API changes,
2828
* the type of the layer changes.
2929

3030
A layer built using a buildpack at API version `0.7` should be considered invalid if the API version for that buildpack has been updated to `0.8`. Similarly, if a layer is changed from being a cache-only layer to being a cache and launch layer, then the cache should be considered invalid.
3131

32-
In addition to general cache invalidation conditions our pip buildpack should invalidate a previous layer if an important property changes, such as:
32+
In addition to general cache invalidation conditions a buildpack should invalidate a previous layer if an important property changes, such as:
3333

3434
* the major version of the runtime changes eg: NodeJS changes from 16 to 18
35-
* requested application dependencies have changed eg: a Python application adds a dependecy on the `requests` module
35+
* requested application dependencies have changed eg: a Python application adds a dependency on the `requests` module
3636

3737
Launch layers are exported to an OCI registry and layer metadata is stored with the launch layer. The layer metadata is commonly used when deciding if a launch layer should be re-used from cache.
3838

@@ -44,22 +44,22 @@ Caching during the production of an application image is necessarily very flexib
4444
2. Create an empty layer, and
4545
3. Set `Launch = true`.
4646

47-
This will guarantee that the previously published application image layer in the registry is re-used if the layer metadata matches the requested metadata. In this most straightforward use-case `Launch` is `true` and both `Build` and `Cache` are set to `false`. That is to say, the most common case is where `Cache = false`, `Build = false` and `Launch = true`. It is important to note that the layer is re-used on on the OCI registry. This avoids expensive rebuilds of the layer and expensive pulls of the layer to the host running the build.
47+
This will guarantee that the previously published application image layer in the registry is re-used if the layer metadata matches the requested metadata. In this most straightforward use-case `Launch` is `true` and both `Build` and `Cache` are set to `false`. That is to say, the most common case is where `Cache = false`, `Build = false` and `Launch = true`. It is important to note that the layer is re-used on the OCI registry. This avoids expensive rebuilds of the layer and expensive pulls of the layer to the host running the build.
4848

49-
Setting `Build = true` makes a layer available to subsequent buildpacks. Therefore binaries installed to the `bin` directory on a `Build = true` layer are available to subsequent buildpacks during the build phase. It is also the case that `lib` directories on a `Build = true` later are added to the `LD_LIBRARY_PATH` during the build phase of subsequent buildpacks. Environment variables defined in a `Build = true` layer are similarly available. For any layer where `Launch = true` and `Build = true` we can no-longer re-use a launch layer from the OCI registry; we must make the layer available locally so that subsequent buildpacks can use it.
49+
Setting `Build = true` makes a layer available to subsequent buildpacks. Therefore binaries installed to the `bin` directory on a `Build = true` layer are available to subsequent buildpacks during the build phase. It is also the case that `lib` directories on a `Build = true` later are added to the `LD_LIBRARY_PATH` during the build phase of subsequent buildpacks. Environment variables defined in a `Build = true` layer are similarly available. For any layer where `Launch = true` and `Build = true`, a launch layer from the OCI registry can no longer be reused. Instead, the layer must be made available locally so that subsequent buildpacks can use it.
5050

5151
Setting `Cache = true` allows additional fine-grained control over caching. The `Cache = true` flag caches a layer and allows a buildpack to make _content_ level decisions about the validity of the cache (as opposed to using the less granular metadata). As an example, suppose a layer where `Launch = true` installs a `jq` binary with version `1.5` and sets `version=1.5` in the layer metadata. By default, this layer will not be re-used from the registry when a buildpack requests `jq` with `version=1.6` to be installed. However, setting `Cache = true` makes a previously built layer available during the build. A buildpack could then prefer to implement logic to restore `jq` with `version=1.5` instead of performing a potentially expensive download of `jq` with `version=1.6`. The `Cache = true` setting allows for cache validation decisions to be made at a level of granularity that is much finer grained than layer metadata.
5252

5353
Setting `Cache = false, Build = false, Launch = true` is the most common configuration. If `Cache = false, Build = false, Launch = true` is not appropriate for your layer, then `Cache = true, Build = true, Launch = true` should be the next combination to evaluate:
5454

55-
* When `Cache = true, Build = true, Launch = true`, explicitly setting `Build = true` makes the layer available, to subsequent buildpacks, during the build phase. As `Cache = true` the layer is restored from local cache before proceeding to the build phase. For example, we might provide a Python distribution in a cached, build and launch layer. The build phase could verify that the restored cached version of our Python distribution contains Python 3.10 but disregard the patch number of the Python interpreter.
55+
* When `Cache = true, Build = true, Launch = true`, explicitly setting `Build = true` makes the layer available, to subsequent buildpacks, during the build phase. As `Cache = true` the layer is restored from local cache before proceeding to the build phase. For example, a Python distribution could be provided in a cached, build and launch layer. The build phase could verify that the restored cached version of the Python distribution contains Python 3.10 but disregard the patch number of the Python interpreter.
5656
* `Cache = true, Build = true, Launch = true` is an appropriate setting for a layer providing a distribution or runtime such as a Python interpreter or NodeJS runtime.
5757

5858
Other common configurations include
5959

6060
* `Cache = true, Build = false, Launch = true` Allows the same caching behavior as `Cache = true, Build = true, Launch = true`, but the layer is not available to subsequent buildpacks. For example, the build phase can restore a Python distribution disregarding the patch number of the `major.minor.patch` number stored in the metadata. As `Build = false` the python interpreter is unavailable to subsequent Buildpacks.
61-
* `Cache = true, Build = true, Launch = false` This configuration is useful where a build time dependency is provided. For example, we might provide a JDK as a cached build layer that is not added as a launch layer. Instead we might provide a JRE as a launch layer in the application image.
61+
* `Cache = true, Build = true, Launch = false` This configuration is useful where a build time dependency is provided. For example, a JDK could be provided as a cached build layer that is not added as a launch layer. Instead, a JRE could be provided as a launch layer in the application image.
6262
* `Cache = true, Build = false, Launch = false` This configuration is particularly useful in layers that download resources. Using a cache-only layer supports allows a buildpack to re-use cached downloads during installation. For example, pip wheels could be downloaded as a cache-only layer and the same buildpack could install the wheels in to a launch layer.
6363

6464
There are other boolean combinations of Cache, Build and Launch. These provide significant flexibility in the caching system. Users of less common caching strategies need a good understanding of the [buildpacks specification on Layer Types](https://github.com/buildpacks/spec/blob/main/buildpack.md#layer-types
65-
).
65+
).

0 commit comments

Comments
 (0)