diff --git a/loader/merge.go b/loader/merge.go index bac9dd70..07ccdb06 100644 --- a/loader/merge.go +++ b/loader/merge.go @@ -203,7 +203,18 @@ func toServicePortConfigsSlice(dst reflect.Value, m map[interface{}]interface{}) for _, v := range m { s = append(s, v.(types.ServicePortConfig)) } - sort.Slice(s, func(i, j int) bool { return s[i].Published < s[j].Published }) + sort.Slice(s, func(i, j int) bool { + if s[i].Target != s[j].Target { + return s[i].Target < s[j].Target + } + if s[i].Published != s[j].Published { + return s[i].Published < s[j].Published + } + if s[i].HostIP != s[j].HostIP { + return s[i].HostIP < s[j].HostIP + } + return s[i].Protocol < s[j].Protocol + }) dst.Set(reflect.ValueOf(s)) return nil } diff --git a/loader/validate.go b/loader/validate.go index 28ecfa70..4493c051 100644 --- a/loader/validate.go +++ b/loader/validate.go @@ -45,13 +45,6 @@ func checkConsistency(project *types.Project) error { } } - if strings.HasPrefix(s.NetworkMode, types.ContainerPrefix) { - containerName := s.NetworkMode[len(types.ContainerPrefix):] - if _, err := project.GetByContainerName(containerName); err != nil { - return fmt.Errorf("service with container_name %q not found for network_mode 'container:%s'", containerName, containerName) - } - } - for _, volume := range s.Volumes { switch volume.Type { case types.VolumeTypeVolume: diff --git a/loader/validate_test.go b/loader/validate_test.go index 3e9f2959..15a6f340 100644 --- a/loader/validate_test.go +++ b/loader/validate_test.go @@ -138,22 +138,4 @@ func TestValidateNetworkMode(t *testing.T) { err := checkConsistency(project) assert.NilError(t, err) }) - - t.Run("network_mode container fail", func(t *testing.T) { - project := &types.Project{ - Services: types.Services([]types.ServiceConfig{ - { - Name: "myservice1", - Image: "scratch", - }, - { - Name: "myservice2", - Image: "scratch", - NetworkMode: "container:nonexistentcontainer", - }, - }), - } - err := checkConsistency(project) - assert.Error(t, err, `service with container_name "nonexistentcontainer" not found for network_mode 'container:nonexistentcontainer'`) - }) } diff --git a/types/project.go b/types/project.go index e8558ecd..155fad0b 100644 --- a/types/project.go +++ b/types/project.go @@ -94,24 +94,6 @@ func (p Project) ConfigNames() []string { return names } -func (p Project) GetByContainerName(names ...string) (Services, error) { - if len(names) == 0 { - return p.Services, nil - } - services := Services{} -outLoop: - for _, name := range names { - for _, s := range p.Services { - if name == s.ContainerName { - services = append(services, s) - continue outLoop - } - } - return nil, fmt.Errorf("service with container_name %q could not be found", name) - } - return services, nil -} - // GetServices retrieve services by names, or return all services if no name specified func (p Project) GetServices(names ...string) (Services, error) { if len(names) == 0 {