diff --git a/pkg/docker/runner.go b/pkg/docker/runner.go index cd0615df28..69bc13417b 100644 --- a/pkg/docker/runner.go +++ b/pkg/docker/runner.go @@ -33,6 +33,12 @@ const ( DefaultStopTimeout = 10 * time.Second ) +type ErrNoImage struct{} + +func (e ErrNoImage) Error() string { + return "Function has no associated image. Has it been built?" +} + // Runner starts and stops functions as local containers. type Runner struct { verbose bool // Verbose logging @@ -81,7 +87,7 @@ func (n *Runner) Run(ctx context.Context, f fn.Function, address string, startTi port = choosePort(host, port, DefaultDialTimeout) if f.Build.Image == "" { - return job, errors.New("Function has no associated image. Has it been built?") + return job, ErrNoImage{} } if c, _, err = NewClient(client.DefaultDockerHost); err != nil { return job, errors.Wrap(err, "failed to create Docker API client") diff --git a/pkg/docker/runner_test.go b/pkg/docker/runner_test.go index 1f31945da7..0f17f7ea32 100644 --- a/pkg/docker/runner_test.go +++ b/pkg/docker/runner_test.go @@ -2,6 +2,7 @@ package docker_test import ( "context" + "errors" "flag" "fmt" "os" @@ -48,9 +49,8 @@ func TestDockerRunImagelessError(t *testing.T) { f := fn.NewFunctionWith(fn.Function{}) _, err := runner.Run(context.Background(), f, "", fn.DefaultStartTimeout) - // TODO: switch to typed error: - expectedErrorMessage := "Function has no associated image. Has it been built?" - if err == nil || err.Error() != expectedErrorMessage { - t.Fatalf("Expected error '%v', got '%v'", expectedErrorMessage, err) + var noImageErr docker.ErrNoImage + if !errors.As(err, &noImageErr) { + t.Fatalf("expected ErrNoImage, got %v", err) } }