|
|
@@ -100,7 +100,7 @@ func (s *composeService) Create(ctx context.Context, project *types.Project, opt
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- prepareNetworkMode(project)
|
|
|
+ prepareServicesDependsOn(project)
|
|
|
|
|
|
return InDependencyOrder(ctx, project, func(c context.Context, service types.ServiceConfig) error {
|
|
|
if utils.StringContains(opts.Services, service.Name) {
|
|
|
@@ -142,18 +142,20 @@ func prepareNetworks(project *types.Project) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func prepareNetworkMode(p *types.Project) {
|
|
|
+func prepareServicesDependsOn(p *types.Project) {
|
|
|
outLoop:
|
|
|
for i := range p.Services {
|
|
|
- dependency := getDependentServiceByNetwork(p.Services[i].NetworkMode)
|
|
|
- if dependency == "" {
|
|
|
+ networkDependency := getDependentServiceFromMode(p.Services[i].NetworkMode)
|
|
|
+ ipcDependency := getDependentServiceFromMode(p.Services[i].Ipc)
|
|
|
+
|
|
|
+ if networkDependency == "" && ipcDependency == "" {
|
|
|
continue
|
|
|
}
|
|
|
if p.Services[i].DependsOn == nil {
|
|
|
p.Services[i].DependsOn = make(types.DependsOnConfig)
|
|
|
}
|
|
|
for _, service := range p.Services {
|
|
|
- if service.Name == dependency {
|
|
|
+ if service.Name == networkDependency || service.Name == ipcDependency {
|
|
|
p.Services[i].DependsOn[service.Name] = types.ServiceDependency{
|
|
|
Condition: types.ServiceConditionStarted,
|
|
|
}
|
|
|
@@ -269,7 +271,14 @@ func (s *composeService) getCreateOptions(ctx context.Context, p *types.Project,
|
|
|
|
|
|
resources := getDeployResources(service)
|
|
|
|
|
|
- networkMode, err := getNetworkMode(ctx, p, service)
|
|
|
+ networkMode, err := getMode(ctx, service.Name, service.NetworkMode)
|
|
|
+ if err != nil {
|
|
|
+ return nil, nil, nil, err
|
|
|
+ }
|
|
|
+ if networkMode == "" {
|
|
|
+ networkMode = getDefaultNetworkMode(p, service)
|
|
|
+ }
|
|
|
+ ipcmode, err := getMode(ctx, service.Name, service.Ipc)
|
|
|
if err != nil {
|
|
|
return nil, nil, nil, err
|
|
|
}
|
|
|
@@ -305,8 +314,9 @@ func (s *composeService) getCreateOptions(ctx context.Context, p *types.Project,
|
|
|
Mounts: mounts,
|
|
|
CapAdd: strslice.StrSlice(service.CapAdd),
|
|
|
CapDrop: strslice.StrSlice(service.CapDrop),
|
|
|
- NetworkMode: networkMode,
|
|
|
+ NetworkMode: container.NetworkMode(networkMode),
|
|
|
Init: service.Init,
|
|
|
+ IpcMode: container.IpcMode(ipcmode),
|
|
|
ReadonlyRootfs: service.ReadOnly,
|
|
|
RestartPolicy: getRestartPolicy(service),
|
|
|
ShmSize: shmSize,
|
|
|
@@ -328,10 +338,21 @@ func (s *composeService) getCreateOptions(ctx context.Context, p *types.Project,
|
|
|
LogConfig: logConfig,
|
|
|
}
|
|
|
|
|
|
- networkConfig := buildDefaultNetworkConfig(service, networkMode, getContainerName(p.Name, service, number))
|
|
|
+ networkConfig := buildDefaultNetworkConfig(service, container.NetworkMode(networkMode), getContainerName(p.Name, service, number))
|
|
|
return &containerConfig, &hostConfig, networkConfig, nil
|
|
|
}
|
|
|
|
|
|
+func getDefaultNetworkMode(project *types.Project, service types.ServiceConfig) string {
|
|
|
+ mode := "none"
|
|
|
+ if len(project.Networks) > 0 {
|
|
|
+ for name := range getNetworksForService(service) {
|
|
|
+ mode = project.Networks[name].Name
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return mode
|
|
|
+}
|
|
|
+
|
|
|
func getRestartPolicy(service types.ServiceConfig) container.RestartPolicy {
|
|
|
var restart container.RestartPolicy
|
|
|
if service.Restart != "" {
|
|
|
@@ -470,12 +491,11 @@ func getVolumesFrom(project *types.Project, volumesFrom []string) ([]string, []s
|
|
|
|
|
|
}
|
|
|
|
|
|
-func getDependentServiceByNetwork(networkMode string) string {
|
|
|
- baseService := ""
|
|
|
- if strings.HasPrefix(networkMode, types.NetworkModeServicePrefix) {
|
|
|
- return networkMode[len(types.NetworkModeServicePrefix):]
|
|
|
+func getDependentServiceFromMode(mode string) string {
|
|
|
+ if strings.HasPrefix(mode, types.NetworkModeServicePrefix) {
|
|
|
+ return mode[len(types.NetworkModeServicePrefix):]
|
|
|
}
|
|
|
- return baseService
|
|
|
+ return ""
|
|
|
}
|
|
|
|
|
|
func (s *composeService) buildContainerVolumes(ctx context.Context, p types.Project, service types.ServiceConfig,
|
|
|
@@ -745,33 +765,22 @@ func getAliases(s types.ServiceConfig, c *types.ServiceNetworkConfig) []string {
|
|
|
return aliases
|
|
|
}
|
|
|
|
|
|
-func getNetworkMode(ctx context.Context, p *types.Project, service types.ServiceConfig) (container.NetworkMode, error) {
|
|
|
+func getMode(ctx context.Context, serviceName string, mode string) (string, error) {
|
|
|
cState, err := GetContextContainerState(ctx)
|
|
|
if err != nil {
|
|
|
- return container.NetworkMode("none"), nil
|
|
|
+ return "", nil
|
|
|
}
|
|
|
observedState := cState.GetContainers()
|
|
|
-
|
|
|
- mode := service.NetworkMode
|
|
|
- if mode == "" {
|
|
|
- if len(p.Networks) > 0 {
|
|
|
- for name := range getNetworksForService(service) {
|
|
|
- return container.NetworkMode(p.Networks[name].Name), nil
|
|
|
- }
|
|
|
- }
|
|
|
- return container.NetworkMode("none"), nil
|
|
|
- }
|
|
|
- depServiceNetworkMode := getDependentServiceByNetwork(service.NetworkMode)
|
|
|
- if depServiceNetworkMode != "" {
|
|
|
- depServiceContainers := observedState.filter(isService(depServiceNetworkMode))
|
|
|
+ depService := getDependentServiceFromMode(mode)
|
|
|
+ if depService != "" {
|
|
|
+ depServiceContainers := observedState.filter(isService(depService))
|
|
|
if len(depServiceContainers) > 0 {
|
|
|
- return container.NetworkMode(types.NetworkModeContainerPrefix + depServiceContainers[0].ID), nil
|
|
|
+ return types.NetworkModeContainerPrefix + depServiceContainers[0].ID, nil
|
|
|
}
|
|
|
- return container.NetworkMode("none"),
|
|
|
- fmt.Errorf(`no containers started for network_mode %q in service %q -> %v`,
|
|
|
- mode, service.Name, observedState)
|
|
|
+ return "", fmt.Errorf(`no containers started for %q in service %q -> %v`,
|
|
|
+ mode, serviceName, observedState)
|
|
|
}
|
|
|
- return container.NetworkMode(mode), nil
|
|
|
+ return mode, nil
|
|
|
}
|
|
|
|
|
|
func getNetworksForService(s types.ServiceConfig) map[string]*types.ServiceNetworkConfig {
|