{"record":{"id":"3e3710f37c88a766","repo":"docker/compose","slug":"invalid-response-from-plugin-s","errorCode":null,"errorMessage":"invalid response from plugin: %s","messagePattern":"invalid response from plugin: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/compose/plugins.go","lineNumber":160,"sourceCode":"\tfor {\n\t\tvar msg JsonMessage\n\t\terr = decoder.Decode(&msg)\n\t\tif errors.Is(err, io.EOF) {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn pluginVariables{}, err\n\t\t}\n\t\tswitch msg.Type {\n\t\tcase ErrorType:\n\t\t\ts.events.On(newEvent(service.Name, api.Error, firstLine(msg.Message)))\n\t\t\treturn pluginVariables{}, errors.New(msg.Message)\n\t\tcase InfoType:\n\t\t\ts.events.On(newEvent(service.Name, api.Working, firstLine(msg.Message)))\n\t\tcase SetEnvType:\n\t\t\tkey, val, found := strings.Cut(msg.Message, \"=\")\n\t\t\tif !found {\n\t\t\t\treturn pluginVariables{}, fmt.Errorf(\"invalid response from plugin: %s\", msg.Message)\n\t\t\t}\n\t\t\tvariables.prefixed[key] = val\n\t\tcase RawSetEnvType:\n\t\t\tkey, val, found := strings.Cut(msg.Message, \"=\")\n\t\t\tif !found {\n\t\t\t\treturn pluginVariables{}, fmt.Errorf(\"invalid response from plugin: %s\", msg.Message)\n\t\t\t}\n\t\t\tvariables.raw[key] = val\n\t\tcase DebugType:\n\t\t\tlogrus.Debugf(\"%s: %s\", service.Name, msg.Message)\n\t\tdefault:\n\t\t\treturn pluginVariables{}, fmt.Errorf(\"invalid response from plugin: %s\", msg.Type)\n\t\t}\n\t}\n\n\terr = cmd.Wait()\n\tif err != nil {\n\t\ts.events.On(errorEvent(service.Name, err.Error()))","sourceCodeStart":142,"sourceCodeEnd":178,"githubUrl":"https://github.com/docker/compose/blob/ddc4b044b62e9f715212ea4143fa830fac76382f/pkg/compose/plugins.go#L142-L178","documentation":"Compose speaks a line protocol with service-provider plugins. A SetEnv message must be KEY=VALUE; when the message contains no '=', it cannot be split and this error is returned, aborting plugin variable collection for the service.","triggerScenarios":"A service provider plugin emits a SetEnv-type message whose payload lacks '=' (e.g. just a key, or free text). Reachable via docker compose up on a service declared with provider:.","commonSituations":"Custom/third-party provider plugins with a buggy message emitter; protocol drift between plugin and compose versions.","solutions":["Fix the plugin to emit strict KEY=VALUE for set-env messages","Update the provider plugin to a version matching this compose release's protocol","Reproduce with the plugin in debug mode (COMPOSE_DEBUG/verbose logs) to capture the offending line"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"vars, err := runProvider(ctx, service)\nif err != nil && strings.Contains(err.Error(), \"invalid response from plugin\") {\n    // plugin protocol bug: capture the message, report against the plugin, do not retry blindly\n}","preventionTips":["When writing provider plugins, emit set-env strictly as KEY=VALUE","Add a protocol conformance test for custom plugins before release"],"tags":["plugins","service-provider","protocol","env"],"backgroundTag":null,"analyzedSha":"ddc4b044b62e9f715212ea4143fa830fac76382f","analyzedAt":"2026-08-15T13:31:42.319Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}