diff --git a/cmd/compose/compose.go b/cmd/compose/compose.go index 504130e97ce..e06b08f762b 100644 --- a/cmd/compose/compose.go +++ b/cmd/compose/compose.go @@ -18,6 +18,7 @@ package compose import ( "context" + "encoding/json" "errors" "fmt" "os" @@ -98,6 +99,9 @@ func AdaptCmd(fn CobraCommand) func(cmd *cobra.Command, args []string) error { Status: err.Error(), } } + if ui.Mode == ui.ModeJSON { + err = makeJSONError(err) + } return err } } @@ -152,6 +156,37 @@ func (o *ProjectOptions) WithServices(dockerCli command.Cli, fn ProjectServicesF }) } +type jsonErrorData struct { + Error bool `json:"error,omitempty"` + Message string `json:"message,omitempty"` +} + +func errorAsJSON(message string) string { + var errorMessage = &jsonErrorData{ + Error: true, + Message: message, + } + marshal, err := json.Marshal(errorMessage) + if err == nil { + return string(marshal) + } else { + return message + } +} + +func makeJSONError(err error) error { + if err == nil { + return err + } + if statusErr, ok := err.(dockercli.StatusError); ok { + return dockercli.StatusError{ + StatusCode: statusErr.StatusCode, + Status: errorAsJSON(statusErr.Status), + } + } + return fmt.Errorf("%s", errorAsJSON(err.Error())) +} + func (o *ProjectOptions) addProjectFlags(f *pflag.FlagSet) { f.StringArrayVar(&o.Profiles, "profile", []string{}, "Specify a profile to enable") f.StringVarP(&o.ProjectName, "project-name", "p", "", "Project name")