diff --git a/docs/extension.md b/docs/extension.md index 5d3ae7691..9b1f40ab4 100644 --- a/docs/extension.md +++ b/docs/extension.md @@ -111,8 +111,8 @@ The provider is responsible for releasing all resources associated with the serv When the user runs `docker compose stop`, Compose invokes ` compose --project-name stop ` for each provider-backed service in reverse dependency order. The provider should pause the resource without releasing it, so a later -`docker compose start` or `docker compose up` can resume it. Any `setenv` JSON message returned during `stop` is ignored, -since dependent services are also stopping. +`docker compose up` can resume it (note that `docker compose start` only restarts existing containers and does not invoke +provider hooks). Any `setenv` JSON message returned during `stop` is ignored, since dependent services are also stopping. The `stop` hook is opt-in: Compose invokes it only when the provider declares a `stop` block in its `metadata` subcommand output. Providers that do not advertise `stop` in metadata (or do not implement the `metadata` subcommand at all) are diff --git a/pkg/compose/plugins.go b/pkg/compose/plugins.go index fe608cd1b..ee9877b0b 100644 --- a/pkg/compose/plugins.go +++ b/pkg/compose/plugins.go @@ -66,6 +66,9 @@ func (s *composeService) runPlugin(ctx context.Context, project *types.Project, if err != nil { return err } + if cmd == nil { + return nil + } variables, err := s.executePlugin(cmd, command, service) if err != nil { @@ -188,9 +191,10 @@ func (s *composeService) setupPluginCommand(ctx context.Context, project *types. case "down": currentCommandMetadata = cmdOptionsMetadata.Down case "stop": - if cmdOptionsMetadata.Stop != nil { - currentCommandMetadata = *cmdOptionsMetadata.Stop + if cmdOptionsMetadata.Stop == nil { + return nil, nil } + currentCommandMetadata = *cmdOptionsMetadata.Stop } provider := *service.Provider diff --git a/pkg/compose/stop.go b/pkg/compose/stop.go index a1e3b5cf5..e62f9cd41 100644 --- a/pkg/compose/stop.go +++ b/pkg/compose/stop.go @@ -54,14 +54,6 @@ func (s *composeService) stop(ctx context.Context, projectName string, options a } serv := project.Services[service] if serv.Provider != nil { - path, err := s.getPluginBinaryPath(serv.Provider.Type) - if err != nil { - return err - } - metadata := s.getPluginMetadata(path, serv.Provider.Type, project) - if metadata.Stop == nil { - return nil - } return s.runPlugin(ctx, project, serv, "stop") } return s.stopContainers(ctx, &serv, containers.filter(isService(service)).filter(isNotOneOff), options.Timeout, event)