Skip to content

Commit 1673252

Browse files
authored
Merge pull request #4115 from Shubhranshu153/fix-buildkit-host
fix: BUILDKIT_HOST env parsing when doing system prune
2 parents 105ca4d + 95fc284 commit 1673252

File tree

4 files changed

+164
-4
lines changed

4 files changed

+164
-4
lines changed

cmd/nerdctl/builder/builder.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ func pruneCommand() *cobra.Command {
5858
SilenceErrors: true,
5959
}
6060

61-
helpers.AddStringFlag(cmd, "buildkit-host", nil, "", "BUILDKIT_HOST", "BuildKit address")
62-
61+
cmd.Flags().String("buildkit-host", "", "BuildKit address")
6362
cmd.Flags().BoolP("all", "a", false, "Remove all unused build cache, not just dangling ones")
6463
cmd.Flags().BoolP("force", "f", false, "Do not prompt for confirmation")
6564
return cmd

cmd/nerdctl/builder/builder_build.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ If Dockerfile is not present and -f is not specified, it will look for Container
4444
SilenceUsage: true,
4545
SilenceErrors: true,
4646
}
47-
helpers.AddStringFlag(cmd, "buildkit-host", nil, "", "BUILDKIT_HOST", "BuildKit address")
47+
cmd.Flags().String("buildkit-host", "", "BuildKit address")
4848
cmd.Flags().StringArray("add-host", nil, "Add a custom host-to-IP mapping (format: \"host:ip\")")
4949
cmd.Flags().StringArrayP("tag", "t", nil, "Name and optionally a tag in the 'name:tag' format")
5050
cmd.Flags().StringP("file", "f", "", "Name of the Dockerfile")
@@ -242,7 +242,7 @@ func processBuildCommandFlag(cmd *cobra.Command, args []string) (types.BuilderBu
242242
}
243243

244244
func GetBuildkitHost(cmd *cobra.Command, namespace string) (string, error) {
245-
if cmd.Flags().Changed("buildkit-host") || os.Getenv("BUILDKIT_HOST") != "" {
245+
if cmd.Flags().Changed("buildkit-host") {
246246
// If address is explicitly specified, use it.
247247
buildkitHost, err := cmd.Flags().GetString("buildkit-host")
248248
if err != nil {
@@ -253,6 +253,14 @@ func GetBuildkitHost(cmd *cobra.Command, namespace string) (string, error) {
253253
}
254254
return buildkitHost, nil
255255
}
256+
257+
if buildkitHost := os.Getenv("BUILDKIT_HOST"); buildkitHost != "" {
258+
if err := buildkitutil.PingBKDaemon(buildkitHost); err != nil {
259+
return "", err
260+
}
261+
return buildkitHost, nil
262+
263+
}
256264
return buildkitutil.GetBuildkitHost(namespace)
257265
}
258266

cmd/nerdctl/builder/builder_build_test.go

+86
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package builder
1919
import (
2020
"errors"
2121
"fmt"
22+
"path/filepath"
2223
"runtime"
2324
"strings"
2425
"testing"
@@ -29,6 +30,7 @@ import (
2930
"github.com/containerd/nerdctl/mod/tigron/require"
3031
"github.com/containerd/nerdctl/mod/tigron/test"
3132

33+
"github.com/containerd/nerdctl/v2/pkg/buildkitutil"
3234
"github.com/containerd/nerdctl/v2/pkg/platformutil"
3335
"github.com/containerd/nerdctl/v2/pkg/testutil"
3436
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest"
@@ -977,3 +979,87 @@ RUN ping -c 5 beta
977979

978980
testCase.Run(t)
979981
}
982+
983+
func TestBuildWithBuildkitConfig(t *testing.T) {
984+
nerdtest.Setup()
985+
986+
testCase := &test.Case{
987+
Require: require.All(
988+
nerdtest.Build,
989+
require.Not(nerdtest.Docker),
990+
),
991+
Setup: func(data test.Data, helpers test.Helpers) {
992+
dockerfile := fmt.Sprintf(`FROM %s
993+
CMD ["echo", "nerdctl-build-test-string"]`, testutil.CommonImage)
994+
data.Temp().Save(dockerfile, "Dockerfile")
995+
data.Labels().Set("buildCtx", data.Temp().Path())
996+
997+
},
998+
SubTests: []*test.Case{
999+
{
1000+
Description: "build with buildkit-host",
1001+
Setup: func(data test.Data, helpers test.Helpers) {
1002+
// Get BuildkitAddr
1003+
buildkitAddr, err := buildkitutil.GetBuildkitHost(testutil.Namespace)
1004+
assert.NilError(helpers.T(), err)
1005+
buildkitAddr = strings.TrimPrefix(buildkitAddr, "unix://")
1006+
1007+
// Symlink the buildkit Socket for testing
1008+
symlinkedBuildkitAddr := filepath.Join(data.Temp().Path(), "buildkit.sock")
1009+
1010+
// Do a negative test to check the setup
1011+
helpers.Fail("build", "-t", data.Identifier(), "--buildkit-host", fmt.Sprintf("unix://%s", symlinkedBuildkitAddr), data.Labels().Get("buildCtx"))
1012+
1013+
// Test build with the symlinked socket
1014+
cmd := helpers.Custom("ln", "-s", buildkitAddr, symlinkedBuildkitAddr)
1015+
cmd.Run(&test.Expected{
1016+
ExitCode: 0,
1017+
})
1018+
helpers.Ensure("build", "-t", data.Identifier(), "--buildkit-host", fmt.Sprintf("unix://%s", symlinkedBuildkitAddr), data.Labels().Get("buildCtx"))
1019+
},
1020+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
1021+
return helpers.Command("run", "--rm", data.Identifier())
1022+
},
1023+
Cleanup: func(data test.Data, helpers test.Helpers) {
1024+
helpers.Anyhow("rmi", "-f", data.Identifier())
1025+
},
1026+
Expected: test.Expects(0, nil, expect.Equals("nerdctl-build-test-string\n")),
1027+
},
1028+
{
1029+
Description: "build with env specified",
1030+
Setup: func(data test.Data, helpers test.Helpers) {
1031+
// Get BuildkitAddr
1032+
buildkitAddr, err := buildkitutil.GetBuildkitHost(testutil.Namespace)
1033+
assert.NilError(helpers.T(), err)
1034+
buildkitAddr = strings.TrimPrefix(buildkitAddr, "unix://")
1035+
1036+
// Symlink the buildkit Socket for testing
1037+
symlinkedBuildkitAddr := filepath.Join(data.Temp().Path(), "buildkit-env.sock")
1038+
1039+
// Do a negative test to ensure setting up the env variable is effective
1040+
cmd := helpers.Command("build", "-t", data.Identifier(), data.Labels().Get("buildCtx"))
1041+
cmd.Setenv("BUILDKIT_HOST", fmt.Sprintf("unix://%s", symlinkedBuildkitAddr))
1042+
cmd.Run(&test.Expected{ExitCode: expect.ExitCodeGenericFail})
1043+
1044+
// Symlink the buildkit socket for testing
1045+
cmd = helpers.Custom("ln", "-s", buildkitAddr, symlinkedBuildkitAddr)
1046+
cmd.Run(&test.Expected{
1047+
ExitCode: 0,
1048+
})
1049+
1050+
cmd = helpers.Command("build", "-t", data.Identifier(), data.Labels().Get("buildCtx"))
1051+
cmd.Setenv("BUILDKIT_HOST", fmt.Sprintf("unix://%s", symlinkedBuildkitAddr))
1052+
cmd.Run(&test.Expected{ExitCode: expect.ExitCodeSuccess})
1053+
},
1054+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
1055+
return helpers.Command("run", "--rm", data.Identifier())
1056+
},
1057+
Cleanup: func(data test.Data, helpers test.Helpers) {
1058+
helpers.Anyhow("rmi", "-f", data.Identifier())
1059+
},
1060+
Expected: test.Expects(0, nil, expect.Equals("nerdctl-build-test-string\n")),
1061+
},
1062+
},
1063+
}
1064+
testCase.Run(t)
1065+
}

cmd/nerdctl/builder/builder_builder_test.go

+67
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,17 @@ package builder
1919
import (
2020
"errors"
2121
"fmt"
22+
"path/filepath"
2223
"strings"
2324
"testing"
2425

26+
"gotest.tools/v3/assert"
27+
28+
"github.com/containerd/nerdctl/mod/tigron/expect"
2529
"github.com/containerd/nerdctl/mod/tigron/require"
2630
"github.com/containerd/nerdctl/mod/tigron/test"
2731

32+
"github.com/containerd/nerdctl/v2/pkg/buildkitutil"
2833
"github.com/containerd/nerdctl/v2/pkg/testutil"
2934
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest"
3035
)
@@ -63,6 +68,68 @@ CMD ["echo", "nerdctl-test-builder-prune"]`, testutil.CommonImage)
6368
Command: test.Command("builder", "prune", "--force", "--all"),
6469
Expected: test.Expects(0, nil, nil),
6570
},
71+
{
72+
Description: "builder with buildkit-host",
73+
NoParallel: true,
74+
Require: require.Not(nerdtest.Docker),
75+
Setup: func(data test.Data, helpers test.Helpers) {
76+
// Get BuildkitAddr
77+
buildkitAddr, err := buildkitutil.GetBuildkitHost(testutil.Namespace)
78+
assert.NilError(helpers.T(), err)
79+
buildkitAddr = strings.TrimPrefix(buildkitAddr, "unix://")
80+
81+
// Symlink the buildkit Socket for testing
82+
symlinkedBuildkitAddr := filepath.Join(data.Temp().Path(), "buildkit.sock")
83+
data.Labels().Set("symlinkedBuildkitAddr", symlinkedBuildkitAddr)
84+
85+
// Do a negative test to check the setup
86+
helpers.Fail("builder", "prune", "--force", "--buildkit-host", fmt.Sprintf("unix://%s", symlinkedBuildkitAddr))
87+
88+
// Test build with the symlinked socket
89+
cmd := helpers.Custom("ln", "-s", buildkitAddr, symlinkedBuildkitAddr)
90+
cmd.Run(&test.Expected{
91+
ExitCode: 0,
92+
})
93+
94+
},
95+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
96+
return helpers.Command("builder", "prune", "--force", "--buildkit-host", fmt.Sprintf("unix://%s", data.Labels().Get("symlinkedBuildkitAddr")))
97+
},
98+
Expected: test.Expects(0, nil, nil),
99+
},
100+
{
101+
Description: "builder with env",
102+
NoParallel: true,
103+
Require: require.Not(nerdtest.Docker),
104+
Setup: func(data test.Data, helpers test.Helpers) {
105+
// Get BuildkitAddr
106+
buildkitAddr, err := buildkitutil.GetBuildkitHost(testutil.Namespace)
107+
assert.NilError(helpers.T(), err)
108+
buildkitAddr = strings.TrimPrefix(buildkitAddr, "unix://")
109+
110+
// Symlink the buildkit Socket for testing
111+
symlinkedBuildkitAddr := filepath.Join(data.Temp().Path(), "buildkit-env.sock")
112+
data.Labels().Set("symlinkedBuildkitAddr", symlinkedBuildkitAddr)
113+
114+
// Do a negative test to ensure setting up the env variable is effective
115+
cmd := helpers.Command("builder", "prune", "--force")
116+
cmd.Setenv("BUILDKIT_HOST", fmt.Sprintf("unix://%s", symlinkedBuildkitAddr))
117+
cmd.Run(&test.Expected{ExitCode: expect.ExitCodeGenericFail})
118+
119+
// Symlink the buildkit socket for testing
120+
cmd = helpers.Custom("ln", "-s", buildkitAddr, symlinkedBuildkitAddr)
121+
cmd.Run(&test.Expected{
122+
ExitCode: 0,
123+
})
124+
},
125+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
126+
symlinkedBuildkitAddr := data.Labels().Get("symlinkedBuildkitAddr")
127+
cmd := helpers.Command("builder", "prune", "--force")
128+
cmd.Setenv("BUILDKIT_HOST", fmt.Sprintf("unix://%s", symlinkedBuildkitAddr))
129+
return cmd
130+
},
131+
Expected: test.Expects(0, nil, nil),
132+
},
66133
{
67134
Description: "Debug",
68135
// `nerdctl builder debug` is currently incompatible with `docker buildx debug`.

0 commit comments

Comments
 (0)