Merge pull request #36 from djmaze/docker-graph-caching
Docker graph caching
This commit is contained in:
commit
17b6c14342
32
DOCS.md
32
DOCS.md
@ -77,10 +77,36 @@ publish:
|
|||||||
build_args:
|
build_args:
|
||||||
- HTTP_PROXY=http://yourproxy.com
|
- HTTP_PROXY=http://yourproxy.com
|
||||||
```
|
```
|
||||||
|
|
||||||
## Layer Caching
|
|
||||||
|
|
||||||
The Drone build environment is, by default, ephemeral meaning that you layers are not saved between builds. The below example combines Drone's caching feature and Docker's `save` and `load` capabilities to cache and restore image layers between builds:
|
## Caching
|
||||||
|
|
||||||
|
The Drone build environment is, by default, ephemeral meaning that you layers are not saved between builds. There are two methods for caching your layers.
|
||||||
|
|
||||||
|
### Graph directory caching
|
||||||
|
|
||||||
|
This is the preferred method when using the `overlay` or `aufs` storage drivers. Just use Drone's caching feature to backup and restore the directory `/drone/docker`, as shown in the following example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
publish:
|
||||||
|
docker:
|
||||||
|
username: kevinbacon
|
||||||
|
password: pa55word
|
||||||
|
email: kevin.bacon@mail.com
|
||||||
|
repo: foo/bar
|
||||||
|
tag:
|
||||||
|
- latest
|
||||||
|
- "1.0.1"
|
||||||
|
|
||||||
|
cache:
|
||||||
|
mount:
|
||||||
|
- /drone/docker
|
||||||
|
```
|
||||||
|
|
||||||
|
NOTE: This probably won't work correctly with the `btrfs` driver, and it will be very inefficient with the `devicemapper` driver. Please make sure to use the `overlay` or `aufs` storage driver with this method.
|
||||||
|
|
||||||
|
### Layer Caching
|
||||||
|
|
||||||
|
The below example combines Drone's caching feature and Docker's `save` and `load` capabilities to cache and restore image layers between builds:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
publish:
|
publish:
|
||||||
|
26
main.go
26
main.go
@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
@ -93,7 +94,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
args := []string{"daemon"}
|
args := []string{"daemon", "-g", "/drone/docker"}
|
||||||
|
|
||||||
if len(vargs.Storage) != 0 {
|
if len(vargs.Storage) != 0 {
|
||||||
args = append(args, "-s", vargs.Storage)
|
args = append(args, "-s", vargs.Storage)
|
||||||
@ -228,6 +229,29 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove untagged images, if any
|
||||||
|
var outbuf bytes.Buffer
|
||||||
|
cmd = exec.Command("docker", "images", "-q", "-f", "dangling=true")
|
||||||
|
cmd.Stdout = &outbuf
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
trace(cmd)
|
||||||
|
err = cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if outbuf.Len() > 0 {
|
||||||
|
images := strings.Split(strings.TrimSpace(outbuf.String()), "\n")
|
||||||
|
cmd = exec.Command("docker", append([]string{"rmi"}, images...)...)
|
||||||
|
cmd.Stdout = os.Stdout
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
trace(cmd)
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Save to tarred image repository
|
// Save to tarred image repository
|
||||||
if len(vargs.Save.File) != 0 {
|
if len(vargs.Save.File) != 0 {
|
||||||
// if the destination directory does not exist, create it
|
// if the destination directory does not exist, create it
|
||||||
|
Loading…
Reference in New Issue
Block a user