https://github.com/suryagaddipati/docker-cache-volume-plugin
Docker volume driver to cache container artifacts
https://github.com/suryagaddipati/docker-cache-volume-plugin
docker driver volume
Last synced: over 1 year ago
JSON representation
Docker volume driver to cache container artifacts
- Host: GitHub
- URL: https://github.com/suryagaddipati/docker-cache-volume-plugin
- Owner: suryagaddipati
- Created: 2017-11-07T16:23:50.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2017-11-16T18:06:42.000Z (over 8 years ago)
- Last Synced: 2025-03-27T06:23:06.430Z (over 1 year ago)
- Topics: docker, driver, volume
- Language: Go
- Homepage:
- Size: 9.91 MB
- Stars: 8
- Watchers: 0
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: Readme.md
Awesome Lists containing this project
README
Docker volume driver to give your container exclusive view of underlying filesystem cache using [overlayfs](https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt).Think of it as `Read committed Isolation level` for your filesystem cache between concurrently running containers.
Changes made by container are synced back to cache on container exit.
*Note*: There is no conflict resolution between changes made by concurrent containers, latest container to exit overwrites all previous changes.
### Installation
`docker plugin install rapt/cachedriver`
### Usage
Volume name is expected to be in `-`
eg:
```
docker run --rm -it --name one --volume-driver rapt/cachedriver -v foo-one:/data busybox sh
/ # ls /data/
/ # echo one >> /data/foo-one.txt
```
An underlying cache `foo` is created at this point but contents written to this cache by the running container is not visible to concurrently running containers.
eg:
```
docker run --rm -it --name two --volume-driver rapt/cachedriver -v foo-two:/data busybox sh
/ # ls /data/ #foo-one.txt is not visible There
```
concurrently running containers `one` and `two` get an isolated view of the cache.
Once container `one` exits changes made by it are written back to the cache.
```
docker run --rm -it --name three --volume-driver rapt/cachedriver -v foo-three:/data busybox sh
/ # ls /data/
/ # foo-one.txt
```
changes made by container `one` are visible to container `three` after container `one` exits.
### Use cases
* ###### Build caches in a continuous integration system.
Build Systems like maven, sbt cache their artifacts but multiple processes cannot use a sigle underlying maven cache due to concurrency issues and exclusive locks. Each maven process requires an isolated view of underlying cache.
```
docker run --rm -it --name one --volume-driver rapt/cachedriver -v foo-one:/~/.m2 busybox sh
/ # mvn install
```
```
docker run --rm -it --name two --volume-driver rapt/cachedriver -v foo-two:/~/.m2 busybox sh
/ # mvn install # .m2 cache is primed here by one
```
### How does it work?
Driver uses overlayfs to provide exclusive view of `lower` directory.
```
docker run --rm -it --name three --volume-driver rapt/cachedriver -v foo-three:/data busybox sh
/ # echo foo-one > /data/foo-one.txt
/ # exit
```
Inside volume driver container
```
/ # docker-runc exec -t 58211af9d85c0e6e095a822f93b6522f0a3fed776c8d9bd72f62a41ebfa7e5c2 sh
/ # mount | grep foo
overlay on /mnt/cache/merged/foo/three type overlay (rw,relatime,lowerdir=/mnt/cache/lower/foo/0,upperdir=/mnt/cache/upper/foo/three,workdir=/mnt/cache/work/foo/three)
/ # ls /mnt/cache/lower/foo/
0 cache-state.json
/ # cat /mnt/cache/lower/foo/cache-state.json
{"state":{"latest":"0"}}
```
After container `one` exits
```
/ # ls /mnt/cache/lower/foo/
0 cache-state.json three
/ # cat /mnt/cache/lower/foo/cache-state.json
{"state":{"latest":"three"}}
```
Start another container for `foo` cache
```
docker run --rm -it --name four --volume-driver rapt/cachedriver -v foo-four:/data busybox sh
/ # ls /data
foo-one.txt
```
Inside volume container, container `four` uses `three` as lower
```
/ # mount | grep foo
overlay on /mnt/cache/merged/foo/four type overlay (rw,relatime,lowerdir=/mnt/cache/lower/foo/three,upperdir=/mnt/cache/upper/foo/four,workdir=/mnt/cache/work/foo/four)
```