design proposal 01: filesystem resolution
This commit is contained in:
parent
ae4e7d91aa
commit
9557ef6b15
|
|
@ -0,0 +1,110 @@
|
||||||
|
# Filesystem Resolution 01
|
||||||
|
|
||||||
|
* Author(s): cgwippern@google.com
|
||||||
|
* Reviewers:
|
||||||
|
* Date: 2020-02-12
|
||||||
|
* Status: [Reviewed/Cancelled/Under implementation/Complete]
|
||||||
|
|
||||||
|
Here is a brief explanation of the Statuses
|
||||||
|
|
||||||
|
1. Reviewed: The proposal PR has been accepted, merged and ready for
|
||||||
|
implementation.
|
||||||
|
2. Under implementation: An accepted proposal is being implemented by actual work.
|
||||||
|
Note: The design might change in this phase based on issues during
|
||||||
|
implementation.
|
||||||
|
3. Cancelled: During or before implementation the proposal was cancelled.
|
||||||
|
It could be due to:
|
||||||
|
* other features added which made the current design proposal obsolete.
|
||||||
|
* No longer a priority.
|
||||||
|
4. Complete: This feature/change is implemented.
|
||||||
|
|
||||||
|
## Background
|
||||||
|
|
||||||
|
Kaniko builds Docker image layers as overlay filesystem layers; specifically it
|
||||||
|
creates a tar file which contains the entire content of a given layer in the
|
||||||
|
overlay filesystem. Each overlay layer corresponds to one image layer.
|
||||||
|
|
||||||
|
Overlay filesystems should only contain the objects changed in each layer;
|
||||||
|
meaning that if only one file changes between some layer A and some B, layer B
|
||||||
|
would only contain a single file (the one that changed).
|
||||||
|
|
||||||
|
To accomplish this, Kaniko walks the entire filesystem to discover every object.
|
||||||
|
Some of these objects may actually be a symlink to another object in the
|
||||||
|
filesystem; in these cases we must consider both the link and the target object.
|
||||||
|
|
||||||
|
Kaniko also maintains a set of whitelisted (aka ignored) filepaths. Any object
|
||||||
|
which matches one of these filepaths should be ignored by kaniko.
|
||||||
|
|
||||||
|
This results in a 3 dimensional search space
|
||||||
|
|
||||||
|
* changed relative to previous layer
|
||||||
|
* symlink
|
||||||
|
* whitelisted
|
||||||
|
|
||||||
|
Kaniko must also track which objects are referred to by multiple stages; this
|
||||||
|
functionality is out of scope for this proposal.
|
||||||
|
|
||||||
|
This search space is currently managed in an inconsistent and somewhat ad-hoc
|
||||||
|
way; code that manages the various search dimensions is spread out and
|
||||||
|
duplicated. There are also a number of poorly handled edge cases which continue
|
||||||
|
to cause bugs.
|
||||||
|
|
||||||
|
The search space dimensions cannot be reduced or substituted.
|
||||||
|
|
||||||
|
Currently there are a number of bugs around symlinks incorrectly resolved,
|
||||||
|
whitelists not respected, and unchanged files added to layers.
|
||||||
|
|
||||||
|
## Design
|
||||||
|
|
||||||
|
Resolution of the filesystem and the objects it contains should be handled
|
||||||
|
consistently and with a single API.
|
||||||
|
|
||||||
|
* Callers of this API should not be concerned with the type of object at a given filepath (e.g. symlink or not).
|
||||||
|
* Callers of this API should not be concerned with whether a given path is whitelisted.
|
||||||
|
* This API should return a set of filepaths which should be added to the layer
|
||||||
|
without further processing.
|
||||||
|
|
||||||
|
The API should take a limited set of arguments
|
||||||
|
* The root path in the filesystem
|
||||||
|
* The whitelist
|
||||||
|
|
||||||
|
The API should return only two arguments
|
||||||
|
* A set of filepaths which should be added to the layer without further
|
||||||
|
processing
|
||||||
|
* error
|
||||||
|
|
||||||
|
### Open Issues/Questions
|
||||||
|
|
||||||
|
\<Ignore symlinks targeting whitelisted paths?\>
|
||||||
|
|
||||||
|
Resolution: Not Yet Resolved
|
||||||
|
|
||||||
|
## Implementation plan
|
||||||
|
|
||||||
|
* Write the new API
|
||||||
|
* Write tests for the new API
|
||||||
|
* Integrate the new API into existing code
|
||||||
|
|
||||||
|
## Integration test plan
|
||||||
|
|
||||||
|
Add integration tests to the existing suite which cover the known bugs
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
Given some path `/usr/lib/foo` which is a link to `/etc/foo/`
|
||||||
|
|
||||||
|
And `/etc/foo` contains `/etc/foo/bar.txt`
|
||||||
|
|
||||||
|
Adding a link `/usr/lib/foo/bar.txt` => `/etc/foo/bar.txt` will break the image
|
||||||
|
|
||||||
|
In a linux shell this raises an error
|
||||||
|
```
|
||||||
|
$ ls /usr/lib/bar
|
||||||
|
=> /usr/lib/bar/foo.txt
|
||||||
|
$ ln -s /usr/lib/bar barlink
|
||||||
|
$ ln -s /usr/lib/bar/foo.txt barlink/foo.txt
|
||||||
|
=> ERROR
|
||||||
|
```
|
||||||
|
|
||||||
|
Given some path `/usr/foo/bar` which is a link to `/dev/null`, and `/dev` is
|
||||||
|
whitelisted `/dev/null` should not be added to the image.
|
||||||
Loading…
Reference in New Issue