diff --git a/cmd/drone-docker/main.go b/cmd/drone-docker/main.go index 4d746ca..36ad2f9 100644 --- a/cmd/drone-docker/main.go +++ b/cmd/drone-docker/main.go @@ -150,6 +150,10 @@ func main() { Name: "target", Usage: "build target", EnvVar: "PLUGIN_TARGET", + cli.StringSliceFlag{ + Name: "cache-from", + Usage: "cache from", + EnvVar: "PLUGIN_CACHE_FROM", }, cli.BoolFlag{ Name: "squash", @@ -245,6 +249,7 @@ func run(c *cli.Context) error { Target: c.String("target"), Squash: c.Bool("squash"), Pull: c.BoolT("pull-image"), + CacheFrom: c.String("cache-from"), Compress: c.Bool("compress"), Repo: c.String("repo"), Labels: c.StringSlice("custom-labels"), diff --git a/docker.go b/docker.go index 2596012..03e1105 100644 --- a/docker.go +++ b/docker.go @@ -47,6 +47,7 @@ type ( Target string // Docker build target Squash bool // Docker build squash Pull bool // Docker build pull + CacheFrom string // Docker build cache-from Compress bool // Docker build compress Repo string // Docker build repository LabelSchema []string // label-schema Label map @@ -104,6 +105,15 @@ func (p Plugin) Exec() error { fmt.Println("Registry credentials not provided. Guest mode enabled.") } + // pre-pull cache image + if p.Build.CacheFrom != "" { + cmd := commandPull(p.Build.CacheFrom) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + trace(cmd) + cmd.Run() + } + if p.Build.Squash && !p.Daemon.Experimental { fmt.Println("Squash build flag is only available when Docker deamon is started with experimental flag. Ignoring...") p.Build.Squash = false @@ -162,6 +172,10 @@ func commandLogin(login Login) *exec.Cmd { ) } +func commandPull(repo string) *exec.Cmd { + return exec.Command(dockerExe, "pull", repo) +} + func commandLoginEmail(login Login) *exec.Cmd { return exec.Command( dockerExe, "login", @@ -204,6 +218,9 @@ func commandBuild(build Build) *exec.Cmd { if build.NoCache { args = append(args, "--no-cache") } + if build.CacheFrom != "" { + args = append(args, "--cache-from", build.CacheFrom) + } for _, arg := range build.ArgsEnv { addProxyValue(&build, arg) }