From d83d107084c3251e81d843b01f716e38ab08d989 Mon Sep 17 00:00:00 2001
From: David Gageot <david@gageot.net>
Date: Mon, 23 Jul 2018 15:10:51 -0700
Subject: [PATCH] Normalize docker file path

Signed-off-by: David Gageot <david@gageot.net>
---
 cmd/skaffold/app/cmd/docker/deps.go | 14 ++------------
 pkg/skaffold/build/local/docker.go  | 12 +++++-------
 pkg/skaffold/docker/context.go      | 14 ++++++++++++++
 pkg/skaffold/docker/parse.go        |  6 +++---
 4 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/cmd/skaffold/app/cmd/docker/deps.go b/cmd/skaffold/app/cmd/docker/deps.go
index b8a7fbc1a8c..db66ca6229c 100644
--- a/cmd/skaffold/app/cmd/docker/deps.go
+++ b/cmd/skaffold/app/cmd/docker/deps.go
@@ -19,7 +19,6 @@ package docker
 import (
 	"io"
 	"path/filepath"
-	"strings"
 
 	cmdutil "github.com/GoogleContainerTools/skaffold/cmd/skaffold/app/cmd/util"
 	"github.com/GoogleContainerTools/skaffold/cmd/skaffold/app/flags"
@@ -63,7 +62,7 @@ func runDeps(out io.Writer, filename, dockerfile, context string) error {
 		return errors.Wrap(err, "parsing skaffold config")
 	}
 	// normalize the provided dockerfile path WRT to the context
-	normalizedPath, err := normalizeDockerfilePath(dockerfile, context)
+	normalizedPath, err := docker.NormalizeDockerfilePath(context, dockerfile)
 	if err != nil {
 		return errors.Wrap(err, "normalizing dockerfile path")
 	}
@@ -79,22 +78,13 @@ func runDeps(out io.Writer, filename, dockerfile, context string) error {
 	return nil
 }
 
-func normalizeDockerfilePath(dockerfile, context string) (string, error) {
-	if !filepath.IsAbs(dockerfile) {
-		if !strings.HasPrefix(dockerfile, context) {
-			dockerfile = filepath.Join(context, dockerfile)
-		}
-	}
-	return filepath.Abs(dockerfile)
-}
-
 func getBuildArgsForDockerfile(config *config.SkaffoldConfig, dockerfile string) map[string]*string {
 	var err error
 	for _, artifact := range config.Build.Artifacts {
 		if artifact.DockerArtifact != nil {
 			artifactPath := artifact.DockerArtifact.DockerfilePath
 			if artifact.Workspace != "" {
-				artifactPath, err = normalizeDockerfilePath(artifactPath, artifact.Workspace)
+				artifactPath, err = docker.NormalizeDockerfilePath(artifact.Workspace, artifactPath)
 				if err != nil {
 					logrus.Warnf("normalizing artifact dockerfile path: %s\n", err.Error())
 				}
diff --git a/pkg/skaffold/build/local/docker.go b/pkg/skaffold/build/local/docker.go
index a3976143120..62dd6a700a3 100644
--- a/pkg/skaffold/build/local/docker.go
+++ b/pkg/skaffold/build/local/docker.go
@@ -22,7 +22,6 @@ import (
 	"io"
 	"os"
 	"os/exec"
-	"path/filepath"
 
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/docker"
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/v1alpha2"
@@ -35,12 +34,12 @@ func (b *Builder) buildDocker(ctx context.Context, out io.Writer, workspace stri
 	initialTag := util.RandomID()
 
 	if b.cfg.UseDockerCLI || b.cfg.UseBuildkit {
-		absDockerfilePath := a.DockerfilePath
-		if !filepath.IsAbs(a.DockerfilePath) {
-			absDockerfilePath = filepath.Join(workspace, a.DockerfilePath)
+		dockerfilePath, err := docker.NormalizeDockerfilePath(workspace, a.DockerfilePath)
+		if err != nil {
+			return "", errors.Wrap(err, "normalizing dockerfile path")
 		}
 
-		args := []string{"build", workspace, "--file", absDockerfilePath, "-t", initialTag}
+		args := []string{"build", workspace, "--file", dockerfilePath, "-t", initialTag}
 		args = append(args, docker.GetBuildArgs(a)...)
 		for _, from := range a.CacheFrom {
 			args = append(args, "--cache-from", from)
@@ -53,8 +52,7 @@ func (b *Builder) buildDocker(ctx context.Context, out io.Writer, workspace stri
 		cmd.Stdout = out
 		cmd.Stderr = out
 
-		err := util.RunCmd(cmd)
-		if err != nil {
+		if err := util.RunCmd(cmd); err != nil {
 			return "", errors.Wrap(err, "running build")
 		}
 	} else {
diff --git a/pkg/skaffold/docker/context.go b/pkg/skaffold/docker/context.go
index 0dbe9226950..7759f017aa9 100644
--- a/pkg/skaffold/docker/context.go
+++ b/pkg/skaffold/docker/context.go
@@ -19,12 +19,26 @@ package docker
 import (
 	"context"
 	"io"
+	"path/filepath"
+	"strings"
 
 	cstorage "cloud.google.com/go/storage"
 	"github.com/GoogleContainerTools/skaffold/pkg/skaffold/util"
 	"github.com/pkg/errors"
 )
 
+// NormalizeDockerfilePath returns the abolute path to the dockerfile.
+func NormalizeDockerfilePath(context, dockerfile string) (string, error) {
+	if filepath.IsAbs(dockerfile) {
+		return dockerfile, nil
+	}
+
+	if !strings.HasPrefix(dockerfile, context) {
+		dockerfile = filepath.Join(context, dockerfile)
+	}
+	return filepath.Abs(dockerfile)
+}
+
 func CreateDockerTarContext(buildArgs map[string]*string, w io.Writer, context, dockerfilePath string) error {
 	paths, err := GetDependencies(buildArgs, context, dockerfilePath)
 	if err != nil {
diff --git a/pkg/skaffold/docker/parse.go b/pkg/skaffold/docker/parse.go
index cf189220e0c..85ebd6a973f 100644
--- a/pkg/skaffold/docker/parse.go
+++ b/pkg/skaffold/docker/parse.go
@@ -168,9 +168,9 @@ func readDockerfile(workspace, absDockerfilePath string, buildArgs map[string]*s
 }
 
 func GetDependencies(buildArgs map[string]*string, workspace, dockerfilePath string) ([]string, error) {
-	absDockerfilePath := dockerfilePath
-	if !filepath.IsAbs(dockerfilePath) {
-		absDockerfilePath = filepath.Join(workspace, dockerfilePath)
+	absDockerfilePath, err := NormalizeDockerfilePath(workspace, dockerfilePath)
+	if err != nil {
+		return nil, errors.Wrap(err, "normalizing dockerfile path")
 	}
 
 	deps, err := readDockerfile(workspace, absDockerfilePath, buildArgs)