|  | @@ -20,6 +20,7 @@ import (
 | 
	
		
			
				|  |  |  	"context"
 | 
	
		
			
				|  |  |  	"fmt"
 | 
	
		
			
				|  |  |  	"strconv"
 | 
	
		
			
				|  |  | +	"strings"
 | 
	
		
			
				|  |  |  	"time"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	"github.com/compose-spec/compose-go/types"
 | 
	
	
		
			
				|  | @@ -314,11 +315,23 @@ func (s *composeService) createMobyContainer(ctx context.Context, project *types
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		return err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +	inspectedContainer, err := s.apiClient.ContainerInspect(ctx, created.ID)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  	createdContainer := moby.Container{
 | 
	
		
			
				|  |  | -		ID:     created.ID,
 | 
	
		
			
				|  |  | -		Labels: containerConfig.Labels,
 | 
	
		
			
				|  |  | +		ID:     inspectedContainer.ID,
 | 
	
		
			
				|  |  | +		Labels: inspectedContainer.Config.Labels,
 | 
	
		
			
				|  |  | +		Names:  []string{inspectedContainer.Name},
 | 
	
		
			
				|  |  | +		NetworkSettings: &moby.SummaryNetworkSettings{
 | 
	
		
			
				|  |  | +			Networks: inspectedContainer.NetworkSettings.Networks,
 | 
	
		
			
				|  |  | +		},
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	cState.Add(createdContainer)
 | 
	
		
			
				|  |  | +	links, err := s.getLinks(ctx, service)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  	for _, netName := range service.NetworksByPriority() {
 | 
	
		
			
				|  |  |  		netwrk := project.Networks[netName]
 | 
	
		
			
				|  |  |  		cfg := service.Networks[netName]
 | 
	
	
		
			
				|  | @@ -329,8 +342,16 @@ func (s *composeService) createMobyContainer(ctx context.Context, project *types
 | 
	
		
			
				|  |  |  				aliases = append(aliases, cfg.Aliases...)
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		err = s.connectContainerToNetwork(ctx, created.ID, netwrk.Name, cfg, aliases...)
 | 
	
		
			
				|  |  | +		if val, ok := createdContainer.NetworkSettings.Networks[netwrk.Name]; ok {
 | 
	
		
			
				|  |  | +			if shortIDAliasExists(createdContainer.ID, val.Aliases...) {
 | 
	
		
			
				|  |  | +				continue
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			err := s.apiClient.NetworkDisconnect(ctx, netwrk.Name, createdContainer.ID, false)
 | 
	
		
			
				|  |  | +			if err != nil {
 | 
	
		
			
				|  |  | +				return err
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		err = s.connectContainerToNetwork(ctx, created.ID, netwrk.Name, cfg, links, aliases...)
 | 
	
		
			
				|  |  |  		if err != nil {
 | 
	
		
			
				|  |  |  			return err
 | 
	
		
			
				|  |  |  		}
 | 
	
	
		
			
				|  | @@ -338,7 +359,16 @@ func (s *composeService) createMobyContainer(ctx context.Context, project *types
 | 
	
		
			
				|  |  |  	return nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func (s *composeService) connectContainerToNetwork(ctx context.Context, id string, netwrk string, cfg *types.ServiceNetworkConfig, aliases ...string) error {
 | 
	
		
			
				|  |  | +func shortIDAliasExists(containerID string, aliases ...string) bool {
 | 
	
		
			
				|  |  | +	for _, alias := range aliases {
 | 
	
		
			
				|  |  | +		if alias == containerID[:12] {
 | 
	
		
			
				|  |  | +			return true
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return false
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (s *composeService) connectContainerToNetwork(ctx context.Context, id string, netwrk string, cfg *types.ServiceNetworkConfig, links []string, aliases ...string) error {
 | 
	
		
			
				|  |  |  	var (
 | 
	
		
			
				|  |  |  		ipv4ddress  string
 | 
	
		
			
				|  |  |  		ipv6Address string
 | 
	
	
		
			
				|  | @@ -351,6 +381,7 @@ func (s *composeService) connectContainerToNetwork(ctx context.Context, id strin
 | 
	
		
			
				|  |  |  		Aliases:           aliases,
 | 
	
		
			
				|  |  |  		IPAddress:         ipv4ddress,
 | 
	
		
			
				|  |  |  		GlobalIPv6Address: ipv6Address,
 | 
	
		
			
				|  |  | +		Links:             links,
 | 
	
		
			
				|  |  |  	})
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		return err
 | 
	
	
		
			
				|  | @@ -358,6 +389,37 @@ func (s *composeService) connectContainerToNetwork(ctx context.Context, id strin
 | 
	
		
			
				|  |  |  	return nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +func (s *composeService) getLinks(ctx context.Context, service types.ServiceConfig) ([]string, error) {
 | 
	
		
			
				|  |  | +	cState, err := GetContextContainerState(ctx)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return nil, err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	links := []string{}
 | 
	
		
			
				|  |  | +	for _, serviceLink := range service.Links {
 | 
	
		
			
				|  |  | +		s := strings.Split(serviceLink, ":")
 | 
	
		
			
				|  |  | +		serviceName := serviceLink
 | 
	
		
			
				|  |  | +		serviceAlias := ""
 | 
	
		
			
				|  |  | +		if len(s) == 2 {
 | 
	
		
			
				|  |  | +			serviceName = s[0]
 | 
	
		
			
				|  |  | +			serviceAlias = s[1]
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		containers := cState.GetContainers()
 | 
	
		
			
				|  |  | +		depServiceContainers := containers.filter(isService(serviceName))
 | 
	
		
			
				|  |  | +		for _, container := range depServiceContainers {
 | 
	
		
			
				|  |  | +			name := getCanonicalContainerName(container)
 | 
	
		
			
				|  |  | +			if serviceAlias != "" {
 | 
	
		
			
				|  |  | +				links = append(links,
 | 
	
		
			
				|  |  | +					fmt.Sprintf("%s:%s", name, serviceAlias))
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			links = append(links,
 | 
	
		
			
				|  |  | +				fmt.Sprintf("%s:%s", name, name),
 | 
	
		
			
				|  |  | +				fmt.Sprintf("%s:%s", name, getContainerNameWithoutProject(container)))
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	links = append(links, service.ExternalLinks...)
 | 
	
		
			
				|  |  | +	return links, nil
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  func (s *composeService) isServiceHealthy(ctx context.Context, project *types.Project, service string) (bool, error) {
 | 
	
		
			
				|  |  |  	containers, err := s.getContainers(ctx, project.Name, oneOffExclude, false, service)
 | 
	
		
			
				|  |  |  	if err != nil {
 |