From a48b59645af338653ed16fd3ef605a46a0d92fbb Mon Sep 17 00:00:00 2001 From: Seth Pollack Date: Tue, 26 Sep 2017 14:42:57 -0400 Subject: [PATCH 1/4] add cache-from --- cmd/drone-docker/main.go | 5 +++++ docker.go | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) 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) } From 008bbaf47bf51feba943cee006c49cf27269913a Mon Sep 17 00:00:00 2001 From: Seth Pollack Date: Thu, 26 Oct 2017 12:26:26 -0400 Subject: [PATCH 2/4] make cache-from an array --- cmd/drone-docker/main.go | 3 ++- docker.go | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cmd/drone-docker/main.go b/cmd/drone-docker/main.go index 36ad2f9..7028cf8 100644 --- a/cmd/drone-docker/main.go +++ b/cmd/drone-docker/main.go @@ -150,6 +150,7 @@ func main() { Name: "target", Usage: "build target", EnvVar: "PLUGIN_TARGET", + }, cli.StringSliceFlag{ Name: "cache-from", Usage: "cache from", @@ -249,7 +250,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"), + CacheFrom: c.StringSlice("cache-from"), Compress: c.Bool("compress"), Repo: c.String("repo"), Labels: c.StringSlice("custom-labels"), diff --git a/docker.go b/docker.go index 03e1105..0a3cfa5 100644 --- a/docker.go +++ b/docker.go @@ -47,7 +47,7 @@ type ( Target string // Docker build target Squash bool // Docker build squash Pull bool // Docker build pull - CacheFrom string // Docker build cache-from + CacheFrom []string // Docker build cache-from Compress bool // Docker build compress Repo string // Docker build repository LabelSchema []string // label-schema Label map @@ -106,8 +106,8 @@ func (p Plugin) Exec() error { } // pre-pull cache image - if p.Build.CacheFrom != "" { - cmd := commandPull(p.Build.CacheFrom) + for _, img := range p.Build.CacheFrom { + cmd := commandPull(img) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr trace(cmd) @@ -218,8 +218,8 @@ 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.CacheFrom { + args = append(args, "--cache-from", arg) } for _, arg := range build.ArgsEnv { addProxyValue(&build, arg) From b31b4bf099a0365a01b4cee779f0ae56a0a6778c Mon Sep 17 00:00:00 2001 From: Ryan Sullivan Date: Wed, 24 Oct 2018 00:48:10 -0400 Subject: [PATCH 3/4] Add docker pull images to main command batch array. Among other cleanup --- cmd/drone-docker/main.go | 2 +- docker.go | 18 ++++++++---------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/cmd/drone-docker/main.go b/cmd/drone-docker/main.go index 7028cf8..89cc480 100644 --- a/cmd/drone-docker/main.go +++ b/cmd/drone-docker/main.go @@ -153,7 +153,7 @@ func main() { }, cli.StringSliceFlag{ Name: "cache-from", - Usage: "cache from", + Usage: "images to consider as cache sources", EnvVar: "PLUGIN_CACHE_FROM", }, cli.BoolFlag{ diff --git a/docker.go b/docker.go index 0a3cfa5..8cea3fc 100644 --- a/docker.go +++ b/docker.go @@ -105,15 +105,6 @@ func (p Plugin) Exec() error { fmt.Println("Registry credentials not provided. Guest mode enabled.") } - // pre-pull cache image - for _, img := range p.Build.CacheFrom { - cmd := commandPull(img) - 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 @@ -126,6 +117,11 @@ func (p Plugin) Exec() error { cmds = append(cmds, commandVersion()) // docker version cmds = append(cmds, commandInfo()) // docker info + // pre-pull cache images + for _, img := range p.Build.CacheFrom { + cmds = append(cmds, commandPull(img)) + } + cmds = append(cmds, commandBuild(p.Build)) // docker build for _, tag := range p.Build.Tags { @@ -148,7 +144,9 @@ func (p Plugin) Exec() error { trace(cmd) err := cmd.Run() - if err != nil { + if err != nil && cmd.Args[1] == "pull" { + fmt.Printf("Could not pull cache-from image %s. Ignoring...\n", cmd.Args[2]) + } else if err != nil { return err } } From 47f3b4bb08ae027e3d791f7895d220c66a98b042 Mon Sep 17 00:00:00 2001 From: shimun Date: Mon, 5 Nov 2018 19:43:29 +0100 Subject: [PATCH 4/4] prevent index out of bounds --- docker.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docker.go b/docker.go index 8cea3fc..c3c7332 100644 --- a/docker.go +++ b/docker.go @@ -144,7 +144,7 @@ func (p Plugin) Exec() error { trace(cmd) err := cmd.Run() - if err != nil && cmd.Args[1] == "pull" { + if err != nil && isCommandPull(cmd.Args) { fmt.Printf("Could not pull cache-from image %s. Ignoring...\n", cmd.Args[2]) } else if err != nil { return err @@ -170,6 +170,11 @@ func commandLogin(login Login) *exec.Cmd { ) } +// helper to check if args match "docker pull " +func isCommandPull(args []string) bool { + return len(args) > 2 && args[1] == "pull" +} + func commandPull(repo string) *exec.Cmd { return exec.Command(dockerExe, "pull", repo) }