Merge pull request #36 from djmaze/docker-graph-caching

Docker graph caching
This commit is contained in:
Brad Rydzewski 2016-02-18 11:30:58 -08:00
commit 17b6c14342
2 changed files with 54 additions and 4 deletions

30
DOCS.md
View File

@ -78,9 +78,35 @@ publish:
- HTTP_PROXY=http://yourproxy.com - HTTP_PROXY=http://yourproxy.com
``` ```
## Layer Caching ## 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: 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
View File

@ -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