Skip to content

Commit

Permalink
build: improve error messages for docker driver
Browse files Browse the repository at this point in the history
Signed-off-by: David Karlsson <[email protected]>
  • Loading branch information
dvdksn committed Aug 18, 2023
1 parent e5419ef commit 58036c5
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 6 deletions.
32 changes: 26 additions & 6 deletions build/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Op

for _, e := range opt.CacheTo {
if e.Type != "inline" && !nodeDriver.Features(ctx)[driver.CacheExport] {
return nil, nil, notSupported(nodeDriver, driver.CacheExport)
return nil, nil, cacheExportNotSupported(nodeDriver)
}
}

Expand Down Expand Up @@ -529,7 +529,7 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Op
// set up exporters
for i, e := range opt.Exports {
if e.Type == "oci" && !nodeDriver.Features(ctx)[driver.OCIExporter] {
return nil, nil, notSupported(nodeDriver, driver.OCIExporter)
return nil, nil, exporterNotSupported(nodeDriver, driver.OCIExporter)
}
if e.Type == "docker" {
features := docker.Features(ctx, e.Attrs["context"])
Expand All @@ -555,7 +555,7 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Op
opt.Exports[i].Output = wrapWriteCloser(w)
}
} else if !nodeDriver.Features(ctx)[driver.DockerExporter] {
return nil, nil, notSupported(nodeDriver, driver.DockerExporter)
return nil, nil, exporterNotSupported(nodeDriver, driver.DockerExporter)
}
}
if e.Type == "image" && nodeDriver.IsMobyDriver() {
Expand Down Expand Up @@ -627,7 +627,7 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Op
pp[i] = platforms.Format(p)
}
if len(pp) > 1 && !nodeDriver.Features(ctx)[driver.MultiPlatform] {
return nil, nil, notSupported(nodeDriver, driver.MultiPlatform)
return nil, nil, multiPlatformBuildNotSupported(nodeDriver)
}
so.FrontendAttrs["platform"] = strings.Join(pp, ",")
}
Expand Down Expand Up @@ -1560,8 +1560,28 @@ func waitContextDeps(ctx context.Context, index int, results *waitmap.Map, so *c
return nil
}

func notSupported(d driver.Driver, f driver.Feature) error {
return errors.Errorf("%s feature is currently not supported for %s driver. Please switch to a different driver (eg. \"docker buildx create --use\")", f, d.Factory().Name())
func cacheExportNotSupported(d driver.Driver) error {
return errors.Errorf(`Cache export is not supported for the %s driver.
Switch to a different driver and try again.
Learn more at https://docs.docker.com/go/build-cache-backends/`, d.Factory().Name())
}

func exporterNotSupported(d driver.Driver, f driver.Feature) error {
return errors.Errorf(`%s is not supported for the %s driver.
Switch to a different driver and try again.
Learn more at https://docs.docker.com/go/build-exporters/`, f, d.Factory().Name())
}

func multiPlatformBuildNotSupported(d driver.Driver) error {
return errors.Errorf(`Multi-platform builds is not supported for the %s driver without the containerd image store.
Switch to a different driver, or turn on the containerd image store, and try again.
Learn more at https://docs.docker.com/go/build-multi-platform/`, d.Factory().Name())
}

func noDefaultLoad() bool {
Expand Down
27 changes: 27 additions & 0 deletions tests/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ var buildTests = []func(t *testing.T, sb integration.Sandbox){
testBuildMobyFromLocalImage,
testBuildDetailsLink,
testBuildProgress,
testBuildDockerWorkerErrors,
}

func testBuild(t *testing.T, sb integration.Sandbox) {
Expand Down Expand Up @@ -313,3 +314,29 @@ func testBuildProgress(t *testing.T, sb integration.Sandbox) {
require.Contains(t, string(plainOutput), "[internal] load build definition from Dockerfile")
require.Contains(t, string(plainOutput), "[base 1/3] FROM docker.io/library/busybox:latest")
}

func testBuildDockerWorkerErrors(t *testing.T, sb integration.Sandbox) {
if !isDockerWorker(sb) {
t.Skip("skipping test for non-docker workers")
}

dir := createTestProject(t)

// registry cache backend
cmd := buildxCmd(sb, withArgs("build", "--cache-to=type=registry", dir))
_, err := cmd.CombinedOutput()
require.Contains(t, err.Error(), "Cache export is not supported")

Check failure on line 328 in tests/build.go

View workflow job for this annotation

GitHub Actions / test (docker, ./tests)

Failed: tests/TestIntegration/TestBuildDockerWorkerErrors/worker=docker

=== RUN TestIntegration/TestBuildDockerWorkerErrors/worker=docker === PAUSE TestIntegration/TestBuildDockerWorkerErrors/worker=docker === CONT TestIntegration/TestBuildDockerWorkerErrors/worker=docker build.go:328: Error Trace: /src/tests/build.go:328 /src/vendor/github.com/moby/buildkit/util/testutil/integration/run.go:91 /src/vendor/github.com/moby/buildkit/util/testutil/integration/run.go:205 Error: "exit status 1" does not contain "Cache export is not supported" Test: TestIntegration/TestBuildDockerWorkerErrors/worker=docker sandbox.go:140: stdout: /usr/bin/dockerd sandbox.go:140: stderr: /usr/bin/dockerd sandbox.go:143: > startCmd 2023-08-18 15:36:44.342345528 +0000 UTC m=+29.368632786 /usr/bin/dockerd --data-root /tmp/integration3900159760/dt001idrvegwk/root --exec-root /tmp/dxr/dt001idrvegwk --pidfile /tmp/integration3900159760/dt001idrvegwk/docker.pid --containerd-namespace dt001idrvegwk --containerd-plugins-namespace dt001idrvegwkp --host unix:///tmp/docker-integration/dt001idrvegwk.sock --config-file /tmp/integration3900159760/daemon.json --userland-proxy=false --tls=false --debug sandbox.go:143: time="2023-08-18T15:36:44.378072042Z" level=info msg="Starting up" sandbox.go:143: time="2023-08-18T15:36:44.379190958Z" level=warning msg="could not change group /tmp/docker-integration/dt001idrvegwk.sock to docker: group docker not found" sandbox.go:143: time="2023-08-18T15:36:44.379380061Z" level=debug msg="Listener created for HTTP on unix (/tmp/docker-integration/dt001idrvegwk.sock)" sandbox.go:143: time="2023-08-18T15:36:44.379397961Z" level=info msg="containerd not running, starting managed containerd" sandbox.go:143: time="2023-08-18T15:36:44.380071271Z" level=info msg="started new containerd process" address=/tmp/dxr/dt001idrvegwk/containerd/containerd.sock module=libcontainerd pid=8173 sandbox.go:143: time="2023-08-18T15:36:44.396140202Z" level=info msg="starting containerd" revision=1677a17964311325ed1c31e2c0a3589ce6d5c30d version=v1.7.1 sandbox.go:143: time="2023-08-18T15:36:44.416109190Z" level=info msg="loading plugin \"io.containerd.snapshotter.v1.aufs\"..." type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:44.416995202Z" level=info msg="skip loading plugin \"io.containerd.snapshotter.v1.aufs\"..." error="aufs is not supported (modprobe aufs failed: exit status 1 \"modprobe: can't change directory to '/lib/modules': No such file or directory\\n\"): skip plugin" type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:44.417022703Z" level=info msg="loading plugin \"io.containerd.content.v1.content\"..." type=io.containerd.content.v1 sandbox.go:143: time="2023-08-18T15:36:44.417172305Z" level=info msg="loading plugin \"io.containerd.snapshotter.v1.native\"..." type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:44.417258506Z" level=info msg="loading plugin \"io.containerd.snapshotter.v1.overlayfs\"..." type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:44.417466809Z" level=info msg="loading plugin \"io.containerd.snapshotter.v1.devmapper\"..." type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:44.417500310Z" level=warning msg="failed to load plugin io.containerd.snapshotter.v1.devmapper" error="devmapper not configured" sandbox.go:143: time="2023-08-18T15:36:44.417514410Z" level=info msg="loading plugin \"io.containerd.snapshotter.v1.zfs\"..." type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:44.417729213Z" level=info msg="skip loading plugin \"io.containerd.snapshotter.v1.zfs\"..." error="path /tmp/integration3900159760/dt001idrvegwk/root/containerd/daemon/io.containerd.snapshotter.v1.zfs must be a zfs filesystem to be used with the zfs snapshotter: skip plugin" type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:44.417765913Z" level=info msg="loading plugin \"io.containerd.metadata.v1.bol

Check failure on line 328 in tests/build.go

View workflow job for this annotation

GitHub Actions / test (docker\+containerd, ./tests)

Failed: tests/TestIntegration/TestBuildDockerWorkerErrors/worker=docker+containerd

=== RUN TestIntegration/TestBuildDockerWorkerErrors/worker=docker+containerd === PAUSE TestIntegration/TestBuildDockerWorkerErrors/worker=docker+containerd === CONT TestIntegration/TestBuildDockerWorkerErrors/worker=docker+containerd build.go:328: Error Trace: /src/tests/build.go:328 /src/vendor/github.com/moby/buildkit/util/testutil/integration/run.go:91 /src/vendor/github.com/moby/buildkit/util/testutil/integration/run.go:205 Error: "exit status 1" does not contain "Cache export is not supported" Test: TestIntegration/TestBuildDockerWorkerErrors/worker=docker+containerd sandbox.go:140: stdout: /usr/bin/dockerd sandbox.go:140: stderr: /usr/bin/dockerd sandbox.go:143: > startCmd 2023-08-18 15:36:41.014426191 +0000 UTC m=+29.355087124 /usr/bin/dockerd --data-root /tmp/integration374279079/duo9y87kddokj/root --exec-root /tmp/dxr/duo9y87kddokj --pidfile /tmp/integration374279079/duo9y87kddokj/docker.pid --containerd-namespace duo9y87kddokj --containerd-plugins-namespace duo9y87kddokjp --host unix:///tmp/docker-integration/duo9y87kddokj.sock --config-file /tmp/integration374279079/daemon.json --userland-proxy=false --tls=false --debug sandbox.go:143: time="2023-08-18T15:36:41.056877500Z" level=info msg="Starting up" sandbox.go:143: time="2023-08-18T15:36:41.058043712Z" level=warning msg="could not change group /tmp/docker-integration/duo9y87kddokj.sock to docker: group docker not found" sandbox.go:143: time="2023-08-18T15:36:41.058210613Z" level=debug msg="Listener created for HTTP on unix (/tmp/docker-integration/duo9y87kddokj.sock)" sandbox.go:143: time="2023-08-18T15:36:41.058229413Z" level=info msg="containerd not running, starting managed containerd" sandbox.go:143: time="2023-08-18T15:36:41.058928720Z" level=info msg="started new containerd process" address=/tmp/dxr/duo9y87kddokj/containerd/containerd.sock module=libcontainerd pid=7962 sandbox.go:143: time="2023-08-18T15:36:41.079015114Z" level=info msg="starting containerd" revision=1677a17964311325ed1c31e2c0a3589ce6d5c30d version=v1.7.1 sandbox.go:143: time="2023-08-18T15:36:41.096508082Z" level=info msg="loading plugin \"io.containerd.snapshotter.v1.aufs\"..." type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:41.097397191Z" level=info msg="skip loading plugin \"io.containerd.snapshotter.v1.aufs\"..." error="aufs is not supported (modprobe aufs failed: exit status 1 \"modprobe: can't change directory to '/lib/modules': No such file or directory\\n\"): skip plugin" type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:41.097450091Z" level=info msg="loading plugin \"io.containerd.content.v1.content\"..." type=io.containerd.content.v1 sandbox.go:143: time="2023-08-18T15:36:41.097582893Z" level=info msg="loading plugin \"io.containerd.snapshotter.v1.native\"..." type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:41.097666093Z" level=info msg="loading plugin \"io.containerd.snapshotter.v1.overlayfs\"..." type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:41.097879095Z" level=info msg="loading plugin \"io.containerd.snapshotter.v1.devmapper\"..." type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:41.097917996Z" level=warning msg="failed to load plugin io.containerd.snapshotter.v1.devmapper" error="devmapper not configured" sandbox.go:143: time="2023-08-18T15:36:41.097937396Z" level=info msg="loading plugin \"io.containerd.snapshotter.v1.zfs\"..." type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:41.098066097Z" level=info msg="skip loading plugin \"io.containerd.snapshotter.v1.zfs\"..." error="path /tmp/integration374279079/duo9y87kddokj/root/containerd/daemon/io.containerd.snapshotter.v1.zfs must be a zfs filesystem to be used with the zfs snapshotter: skip plugin" type=io.containerd.snapshotter.v1 sandbox.go:143: time="2023-08-18T15:36:41.098099498Z" level=info msg="loadin
require.Contains(t, err.Error(), "https://docs.docker.com/go/build-cache-backends/")

// oci exporter
cmd = buildxCmd(sb, withArgs("build", (fmt.Sprintf("--output=type=oci,dest=%s/result", dir)), dir))
_, err = cmd.CombinedOutput()
require.Contains(t, err.Error(), "OCI exporter feature is not supported")
require.Contains(t, err.Error(), "https://docs.docker.com/go/build-exporters/")

// multi-platform
cmd = buildxCmd(sb, withArgs("build", "--platform=linux/amd64,linux/arm64", dir))
_, err = cmd.CombinedOutput()
require.Contains(t, err.Error(), "Multi-platform builds is not supported")
require.Contains(t, err.Error(), "https://docs.docker.com/go/build-multi-platform/")
}

0 comments on commit 58036c5

Please sign in to comment.