Skip to content

Commit

Permalink
fix dockerfile local dir
Browse files Browse the repository at this point in the history
Signed-off-by: Ye Sijun <junnplus@gmail.com>
  • Loading branch information
junnplus committed Jul 6, 2022
1 parent 60e5e9a commit eb3715a
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 7 deletions.
20 changes: 13 additions & 7 deletions cmd/nerdctl/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,6 @@ func generateBuildctlArgs(cmd *cobra.Command, buildkitHost string, platform, arg
"--progress=" + progressValue,
"--frontend=dockerfile.v0",
"--local=context=" + buildContext,
"--local=dockerfile=" + buildContext,
"--output=" + output,
}...)

Expand All @@ -336,28 +335,35 @@ func generateBuildctlArgs(cmd *cobra.Command, buildkitHost string, platform, arg
return "", nil, false, "", nil, nil, err
}

var dir, file string

dir := buildContext
file := buildkitutil.DefaultDockerfileName
if filename != "" {
if filename == "-" {
var err error
dir, err = buildkitutil.WriteTempDockerfile(cmd.InOrStdin())
if err != nil {
return "", nil, false, "", nil, nil, err
}
file = buildkitutil.DefaultDockerfileName
cleanup = func() {
os.RemoveAll(dir)
}
} else {
dir, file = filepath.Split(filename)
}

if dir != "" {
buildctlArgs = append(buildctlArgs, "--local=dockerfile="+dir)
if dir == "" {
dir = "."
}
buildctlArgs = append(buildctlArgs, "--opt=filename="+file)
}
absDir, err := filepath.Abs(dir)
if err != nil {
return "", nil, false, "", nil, nil, err
}
if _, err := os.Lstat(filepath.Join(absDir, file)); err != nil {
return "", nil, false, "", nil, nil, err
}
buildctlArgs = append(buildctlArgs, "--local=dockerfile="+dir)
buildctlArgs = append(buildctlArgs, "--opt=filename="+file)

target, err := cmd.Flags().GetString("target")
if err != nil {
Expand Down
32 changes: 32 additions & 0 deletions cmd/nerdctl/build_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,38 @@ CMD ["echo", "nerdctl-build-test-stdin"]
base.Cmd("build", "-t", imageName, "-f", "-", ".").CmdOption(testutil.WithStdin(strings.NewReader(dockerfile))).AssertCombinedOutContains(imageName)
}

func TestBuildWithDockerfile(t *testing.T) {
testutil.RequiresBuild(t)
base := testutil.NewBase(t)
defer base.Cmd("builder", "prune").Run()
imageName := testutil.Identifier(t)
defer base.Cmd("rmi", imageName).Run()

dockerfile := fmt.Sprintf(`FROM %s
CMD ["echo", "nerdctl-build-test-dockerfile"]
`, testutil.CommonImage)

buildCtx := filepath.Join(t.TempDir(), "test")
err := os.MkdirAll(buildCtx, 0755)
assert.NilError(t, err)
err = os.WriteFile(filepath.Join(buildCtx, "Dockerfile"), []byte(dockerfile), 0644)
assert.NilError(t, err)

pwd, err := os.Getwd()
assert.NilError(t, err)
err = os.Chdir(buildCtx)
assert.NilError(t, err)
defer os.Chdir(pwd)

// hack os.Getwd return "(unreachable)" on rootless
t.Setenv("PWD", buildCtx)

base.Cmd("build", "-t", imageName, "-f", "Dockerfile", "..").AssertOK()
base.Cmd("build", "-t", imageName, "-f", "Dockerfile", ".").AssertOK()
// fail err: no such file or directory
base.Cmd("build", "-t", imageName, "-f", "../Dockerfile", ".").AssertFail()
}

func TestBuildLocal(t *testing.T) {
t.Parallel()
testutil.DockerIncompatible(t)
Expand Down

0 comments on commit eb3715a

Please sign in to comment.