From c5e01da3c65dacbb91c911faaf21c580b82052c9 Mon Sep 17 00:00:00 2001 From: guessi Date: Thu, 16 Feb 2017 00:30:32 +0800 Subject: [PATCH 1/3] Conditional ignore `force` flag for `docker-tag` `docker tag -f` will now become an error, since it was removed after upgrading docker daemon to 1.12.0 (or later) this PR is to bypass `force` flag if docker >= 1.12.0 was detected reference: - https://docs.docker.com/engine/deprecated/#/f-flag-on-docker-tag Signed-off-by: guessi --- builder/docker/driver_docker.go | 31 +++++++++++++++++-- .../docs/post-processors/docker-tag.html.md | 2 ++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/builder/docker/driver_docker.go b/builder/docker/driver_docker.go index a537ab2ec..ea71722ad 100644 --- a/builder/docker/driver_docker.go +++ b/builder/docker/driver_docker.go @@ -275,8 +275,35 @@ func (d *DockerDriver) StopContainer(id string) error { func (d *DockerDriver) TagImage(id string, repo string, force bool) error { args := []string{"tag"} - if force { - args = append(args, "-f") + + // detect running docker version before tagging + // flag `force` for docker tagging was removed after Docker 1.12.0 + // to keep its backward compatibility, we are not going to remove `force` + // option, but to ignore it when Docker version >= 1.12.0 + // + // for more detail, please refer to the following links: + // - https://docs.docker.com/engine/deprecated/#/f-flag-on-docker-tag + // - https://github.com/docker/docker/pull/23090 + output, err := exec.Command("docker", "--version").Output() + if err != nil { + return err + } + + match := regexp.MustCompile(version.VersionRegexpRaw).FindSubmatch(output) + if match == nil { + return fmt.Errorf("Unknown Docker version: %s", output) + } + + version_running, _ := version.NewVersion(string(match[0])) + version_deprecated, _ := version.NewVersion("1.12.0") + + if version_running.LessThan(version_deprecated) { + if force { + args = append(args, "-f") + } + } else { + // do nothing if Docker version >= 1.12.0 + log.Printf("[WARN] force is removed since Docker 1.12.0") } args = append(args, id, repo) diff --git a/website/source/docs/post-processors/docker-tag.html.md b/website/source/docs/post-processors/docker-tag.html.md index ea9fccad1..00e1ec858 100644 --- a/website/source/docs/post-processors/docker-tag.html.md +++ b/website/source/docs/post-processors/docker-tag.html.md @@ -33,6 +33,8 @@ repository is required. - `force` (boolean) - If true, this post-processor forcibly tag the image even if tag name is collided. Default to `false`. + But it will be ignore if Docker version greater or equal than 1.12.0, + since the `force` option was removed after 1.12.0. [reference](https://docs.docker.com/engine/deprecated/#/f-flag-on-docker-tag) ## Example From 5eae809b0cd17fe991dbccb76dca70836caaa2f1 Mon Sep 17 00:00:00 2001 From: guessi Date: Thu, 16 Feb 2017 01:14:21 +0800 Subject: [PATCH 2/3] improve description --- builder/docker/driver_docker.go | 3 ++- website/source/docs/post-processors/docker-tag.html.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/builder/docker/driver_docker.go b/builder/docker/driver_docker.go index ea71722ad..26355718e 100644 --- a/builder/docker/driver_docker.go +++ b/builder/docker/driver_docker.go @@ -303,7 +303,8 @@ func (d *DockerDriver) TagImage(id string, repo string, force bool) error { } } else { // do nothing if Docker version >= 1.12.0 - log.Printf("[WARN] force is removed since Docker 1.12.0") + log.Printf("[WARN] option: \"force\" will be ignored here") + log.Printf("since it was removed after Docker 1.12.0 released") } args = append(args, id, repo) diff --git a/website/source/docs/post-processors/docker-tag.html.md b/website/source/docs/post-processors/docker-tag.html.md index 00e1ec858..777f1cc5a 100644 --- a/website/source/docs/post-processors/docker-tag.html.md +++ b/website/source/docs/post-processors/docker-tag.html.md @@ -33,7 +33,7 @@ repository is required. - `force` (boolean) - If true, this post-processor forcibly tag the image even if tag name is collided. Default to `false`. - But it will be ignore if Docker version greater or equal than 1.12.0, + But it will be ignored if Docker >= 1.12.0 was detected, since the `force` option was removed after 1.12.0. [reference](https://docs.docker.com/engine/deprecated/#/f-flag-on-docker-tag) ## Example From 66615e3f566a106ad8c33c6277b2611c70d3d101 Mon Sep 17 00:00:00 2001 From: guessi Date: Thu, 16 Feb 2017 08:26:44 +0800 Subject: [PATCH 3/3] reuse the func DockerDriver.Version() --- builder/docker/driver_docker.go | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/builder/docker/driver_docker.go b/builder/docker/driver_docker.go index 26355718e..53a62832c 100644 --- a/builder/docker/driver_docker.go +++ b/builder/docker/driver_docker.go @@ -284,27 +284,25 @@ func (d *DockerDriver) TagImage(id string, repo string, force bool) error { // for more detail, please refer to the following links: // - https://docs.docker.com/engine/deprecated/#/f-flag-on-docker-tag // - https://github.com/docker/docker/pull/23090 - output, err := exec.Command("docker", "--version").Output() + version_running, err := d.Version() if err != nil { return err } - match := regexp.MustCompile(version.VersionRegexpRaw).FindSubmatch(output) - if match == nil { - return fmt.Errorf("Unknown Docker version: %s", output) + version_deprecated, err := version.NewVersion(string("1.12.0")) + if err != nil { + // should never reach this line + return err } - version_running, _ := version.NewVersion(string(match[0])) - version_deprecated, _ := version.NewVersion("1.12.0") - - if version_running.LessThan(version_deprecated) { - if force { + if force { + if version_running.LessThan(version_deprecated) { args = append(args, "-f") + } else { + // do nothing if Docker version >= 1.12.0 + log.Printf("[WARN] option: \"force\" will be ignored here") + log.Printf("since it was removed after Docker 1.12.0 released") } - } else { - // do nothing if Docker version >= 1.12.0 - log.Printf("[WARN] option: \"force\" will be ignored here") - log.Printf("since it was removed after Docker 1.12.0 released") } args = append(args, id, repo)