浏览代码

inspect image ID after pull to se com.docker.compose.image

Signed-off-by: Nicolas De Loof <[email protected]>
Nicolas De Loof 3 年之前
父节点
当前提交
00fd1c1530
共有 1 个文件被更改,包括 30 次插入14 次删除
  1. 30 14
      pkg/compose/pull.go

+ 30 - 14
pkg/compose/pull.go

@@ -95,7 +95,7 @@ func (s *composeService) pull(ctx context.Context, project *types.Project, opts
 		}
 
 		eg.Go(func() error {
-			err := s.pullServiceImage(ctx, service, info, s.configFile(), w, false)
+			_, err := s.pullServiceImage(ctx, service, info, s.configFile(), w, false)
 			if err != nil {
 				if !opts.IgnoreFailures {
 					if service.Build != nil {
@@ -118,7 +118,7 @@ func (s *composeService) pull(ctx context.Context, project *types.Project, opts
 	return err
 }
 
-func (s *composeService) pullServiceImage(ctx context.Context, service types.ServiceConfig, info moby.Info, configFile driver.Auth, w progress.Writer, quietPull bool) error {
+func (s *composeService) pullServiceImage(ctx context.Context, service types.ServiceConfig, info moby.Info, configFile driver.Auth, w progress.Writer, quietPull bool) (string, error) {
 	w.Event(progress.Event{
 		ID:     service.Name,
 		Status: progress.Working,
@@ -126,12 +126,12 @@ func (s *composeService) pullServiceImage(ctx context.Context, service types.Ser
 	})
 	ref, err := reference.ParseNormalizedNamed(service.Image)
 	if err != nil {
-		return err
+		return "", err
 	}
 
 	repoInfo, err := registry.ParseRepositoryInfo(ref)
 	if err != nil {
-		return err
+		return "", err
 	}
 
 	key := repoInfo.Index.Name
@@ -141,12 +141,12 @@ func (s *composeService) pullServiceImage(ctx context.Context, service types.Ser
 
 	authConfig, err := configFile.GetAuthConfig(key)
 	if err != nil {
-		return err
+		return "", err
 	}
 
 	buf, err := json.Marshal(authConfig)
 	if err != nil {
-		return err
+		return "", err
 	}
 
 	stream, err := s.apiClient().ImagePull(ctx, service.Image, moby.ImagePullOptions{
@@ -159,7 +159,7 @@ func (s *composeService) pullServiceImage(ctx context.Context, service types.Ser
 			Status: progress.Error,
 			Text:   "Error",
 		})
-		return WrapCategorisedComposeError(err, PullFailure)
+		return "", WrapCategorisedComposeError(err, PullFailure)
 	}
 
 	dec := json.NewDecoder(stream)
@@ -169,10 +169,10 @@ func (s *composeService) pullServiceImage(ctx context.Context, service types.Ser
 			if err == io.EOF {
 				break
 			}
-			return WrapCategorisedComposeError(err, PullFailure)
+			return "", WrapCategorisedComposeError(err, PullFailure)
 		}
 		if jm.Error != nil {
-			return WrapCategorisedComposeError(errors.New(jm.Error.Message), PullFailure)
+			return "", WrapCategorisedComposeError(errors.New(jm.Error.Message), PullFailure)
 		}
 		if !quietPull {
 			toPullProgressEvent(service.Name, jm, w)
@@ -183,7 +183,12 @@ func (s *composeService) pullServiceImage(ctx context.Context, service types.Ser
 		Status: progress.Done,
 		Text:   "Pulled",
 	})
-	return nil
+
+	inspected, _, err := s.dockerCli.Client().ImageInspectWithRaw(ctx, service.Image)
+	if err != nil {
+		return "", err
+	}
+	return inspected.ID, nil
 }
 
 func (s *composeService) pullRequiredImages(ctx context.Context, project *types.Project, images map[string]string, quietPull bool) error {
@@ -220,10 +225,12 @@ func (s *composeService) pullRequiredImages(ctx context.Context, project *types.
 	return progress.Run(ctx, func(ctx context.Context) error {
 		w := progress.ContextWriter(ctx)
 		eg, ctx := errgroup.WithContext(ctx)
-		for _, service := range needPull {
-			service := service
+		pulledImages := make([]string, len(needPull))
+		for i, service := range needPull {
+			i, service := i, service
 			eg.Go(func() error {
-				err := s.pullServiceImage(ctx, service, info, s.configFile(), w, quietPull)
+				id, err := s.pullServiceImage(ctx, service, info, s.configFile(), w, quietPull)
+				pulledImages[i] = id
 				if err != nil && service.Build != nil {
 					// image can be built, so we can ignore pull failure
 					return nil
@@ -231,7 +238,16 @@ func (s *composeService) pullRequiredImages(ctx context.Context, project *types.
 				return err
 			})
 		}
-		return eg.Wait()
+		for i, service := range needPull {
+			if pulledImages[i] != "" {
+				images[service.Image] = pulledImages[i]
+			}
+		}
+		err := eg.Wait()
+		if err != nil {
+			return err
+		}
+		return err
 	})
 }