mirror of https://github.com/docker/compose.git
Merge pull request #11110 from ndeloof/wait_missing
fail start if depependency is missing
This commit is contained in:
commit
b8773ad1c5
|
@ -318,7 +318,7 @@ func containerReasonEvents(containers Containers, eventFunc func(string, string)
|
|||
const ServiceConditionRunningOrHealthy = "running_or_healthy"
|
||||
|
||||
//nolint:gocyclo
|
||||
func (s *composeService) waitDependencies(ctx context.Context, project *types.Project, dependencies types.DependsOnConfig, containers Containers) error {
|
||||
func (s *composeService) waitDependencies(ctx context.Context, project *types.Project, dependant string, dependencies types.DependsOnConfig, containers Containers) error {
|
||||
eg, _ := errgroup.WithContext(ctx)
|
||||
w := progress.ContextWriter(ctx)
|
||||
for dep, config := range dependencies {
|
||||
|
@ -330,6 +330,13 @@ func (s *composeService) waitDependencies(ctx context.Context, project *types.Pr
|
|||
|
||||
waitingFor := containers.filter(isService(dep))
|
||||
w.Events(containerEvents(waitingFor, progress.Waiting))
|
||||
if len(waitingFor) == 0 {
|
||||
if config.Required {
|
||||
return fmt.Errorf("%s is missing dependency %s", dependant, dep)
|
||||
}
|
||||
logrus.Warnf("%s is missing dependency %s", dependant, dep)
|
||||
continue
|
||||
}
|
||||
|
||||
dep, config := dep, config
|
||||
eg.Go(func() error {
|
||||
|
@ -729,7 +736,7 @@ func (s *composeService) startService(ctx context.Context, project *types.Projec
|
|||
return nil
|
||||
}
|
||||
|
||||
err := s.waitDependencies(ctx, project, service.DependsOn, containers)
|
||||
err := s.waitDependencies(ctx, project, service.Name, service.DependsOn, containers)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -229,7 +229,7 @@ func TestWaitDependencies(t *testing.T) {
|
|||
"db": {Condition: ServiceConditionRunningOrHealthy},
|
||||
"redis": {Condition: ServiceConditionRunningOrHealthy},
|
||||
}
|
||||
assert.NilError(t, tested.waitDependencies(context.Background(), &project, dependencies, nil))
|
||||
assert.NilError(t, tested.waitDependencies(context.Background(), &project, "", dependencies, nil))
|
||||
})
|
||||
t.Run("should skip dependencies with condition service_started", func(t *testing.T) {
|
||||
dbService := types.ServiceConfig{Name: "db", Scale: 1}
|
||||
|
@ -239,6 +239,6 @@ func TestWaitDependencies(t *testing.T) {
|
|||
"db": {Condition: types.ServiceConditionStarted, Required: true},
|
||||
"redis": {Condition: types.ServiceConditionStarted, Required: true},
|
||||
}
|
||||
assert.NilError(t, tested.waitDependencies(context.Background(), &project, dependencies, nil))
|
||||
assert.NilError(t, tested.waitDependencies(context.Background(), &project, "", dependencies, nil))
|
||||
})
|
||||
}
|
||||
|
|
|
@ -92,7 +92,7 @@ func (s *composeService) prepareRun(ctx context.Context, project *types.Project,
|
|||
}
|
||||
|
||||
if !opts.NoDeps {
|
||||
if err := s.waitDependencies(ctx, project, service.DependsOn, observedState); err != nil {
|
||||
if err := s.waitDependencies(ctx, project, service.Name, service.DependsOn, observedState); err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
|
|
|
@ -148,7 +148,7 @@ func (s *composeService) start(ctx context.Context, projectName string, options
|
|||
defer cancel()
|
||||
}
|
||||
|
||||
err = s.waitDependencies(ctx, project, depends, containers)
|
||||
err = s.waitDependencies(ctx, project, project.Name, depends, containers)
|
||||
if err != nil {
|
||||
if errors.Is(ctx.Err(), context.DeadlineExceeded) {
|
||||
return fmt.Errorf("application not healthy after %s", options.WaitTimeout)
|
||||
|
|
Loading…
Reference in New Issue