diff --git a/pkg/compose/compose.go b/pkg/compose/compose.go index 8012dfd4b..1fc6597a5 100644 --- a/pkg/compose/compose.go +++ b/pkg/compose/compose.go @@ -24,6 +24,7 @@ import ( "os" "strconv" "strings" + "sync" "github.com/compose-spec/compose-go/types" "github.com/distribution/distribution/v3/reference" @@ -33,6 +34,7 @@ import ( "github.com/docker/cli/cli/streams" moby "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/client" "github.com/opencontainers/go-digest" "github.com/pkg/errors" @@ -262,3 +264,23 @@ func (s *composeService) actualNetworks(ctx context.Context, projectName string) } return actual, nil } + +var swarmEnabled = struct { + once sync.Once + val bool + err error +}{} + +func (s *composeService) isSWarmEnabled(ctx context.Context) (bool, error) { + swarmEnabled.once.Do(func() { + info, err := s.apiClient().Info(ctx) + if err != nil { + swarmEnabled.err = err + } + if info.Swarm.LocalNodeState == swarm.LocalNodeStateInactive { + swarmEnabled.val = info.Swarm.LocalNodeState == swarm.LocalNodeStateInactive + } + }) + return swarmEnabled.val, swarmEnabled.err + +} diff --git a/pkg/compose/create.go b/pkg/compose/create.go index 0d5930b7c..bdaff2618 100644 --- a/pkg/compose/create.go +++ b/pkg/compose/create.go @@ -1103,7 +1103,13 @@ func (s *composeService) ensureNetwork(ctx context.Context, n types.NetworkConfi // Here we assume `driver` is relevant for a network we don't manage // which is a non-sense, but this is our legacy ¯\(ツ)/¯ // networkAttach will later fail anyway if network actually doesn't exists - return nil + enabled, err := s.isSWarmEnabled(ctx) + if err != nil { + return err + } + if enabled { + return nil + } } return fmt.Errorf("network %s declared as external, but could not be found", n.Name) }