(project *types.Project, svc types.ServiceConfig)
| 435 | } |
| 436 | |
| 437 | func Parse(project *types.Project, svc types.ServiceConfig) (*Service, error) { |
| 438 | warnUnknownFields(svc) |
| 439 | |
| 440 | replicas, err := getReplicas(svc) |
| 441 | if err != nil { |
| 442 | return nil, err |
| 443 | } |
| 444 | |
| 445 | parsed := &Service{ |
| 446 | Image: svc.Image, |
| 447 | PullMode: "missing", |
| 448 | Containers: make([]Container, replicas), |
| 449 | Unparsed: &svc, |
| 450 | } |
| 451 | |
| 452 | if svc.Build == nil { |
| 453 | if parsed.Image == "" { |
| 454 | return nil, fmt.Errorf("service %s: missing image", svc.Name) |
| 455 | } |
| 456 | } else { |
| 457 | if parsed.Image == "" { |
| 458 | parsed.Image = DefaultImageName(project.Name, svc.Name) |
| 459 | } |
| 460 | parsed.Build, err = parseBuildConfig(svc.Build, project, parsed.Image) |
| 461 | if err != nil { |
| 462 | return nil, fmt.Errorf("service %s: failed to parse build: %w", svc.Name, err) |
| 463 | } |
| 464 | } |
| 465 | |
| 466 | switch svc.PullPolicy { |
| 467 | case "", types.PullPolicyMissing, types.PullPolicyIfNotPresent: |
| 468 | // NOP |
| 469 | case types.PullPolicyAlways, types.PullPolicyNever: |
| 470 | parsed.PullMode = svc.PullPolicy |
| 471 | case types.PullPolicyBuild: |
| 472 | if parsed.Build == nil { |
| 473 | return nil, fmt.Errorf("service %s: pull_policy \"build\" requires build config", svc.Name) |
| 474 | } |
| 475 | parsed.Build.Force = true |
| 476 | parsed.PullMode = "never" |
| 477 | default: |
| 478 | return nil, fmt.Errorf("invalid --pull option %q", svc.PullPolicy) |
| 479 | } |
| 480 | |
| 481 | for i := 0; i < replicas; i++ { |
| 482 | container, err := newContainer(project, parsed, i) |
| 483 | if err != nil { |
| 484 | return nil, err |
| 485 | } |
| 486 | parsed.Containers[i] = *container |
| 487 | } |
| 488 | |
| 489 | return parsed, nil |
| 490 | } |
| 491 | |
| 492 | func newContainer(project *types.Project, parsed *Service, i int) (*Container, error) { |
| 493 | svc := *parsed.Unparsed |
searching dependent graphs…