mirror of https://github.com/docker/compose.git
				
				
				
			Merge pull request #10235 from glours/dry-run-cp-support
support dry-run for cp command
This commit is contained in:
		
						commit
						23585b9e6d
					
				|  | @ -18,9 +18,11 @@ package api | |||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"net" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	moby "github.com/docker/docker/api/types" | ||||
| 	containerType "github.com/docker/docker/api/types/container" | ||||
|  | @ -35,6 +37,10 @@ import ( | |||
| 	specs "github.com/opencontainers/image-spec/specs-go/v1" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	DRYRUN_PREFIX = " DRY-RUN MODE - " | ||||
| ) | ||||
| 
 | ||||
| var _ client.APIClient = &DryRunClient{} | ||||
| 
 | ||||
| type DryRunKey struct{} | ||||
|  | @ -95,11 +101,18 @@ func (d *DryRunClient) ContainerUnpause(ctx context.Context, container string) e | |||
| } | ||||
| 
 | ||||
| func (d *DryRunClient) CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, moby.ContainerPathStat, error) { | ||||
| 	return nil, moby.ContainerPathStat{}, ErrNotImplemented | ||||
| 	rc := io.NopCloser(strings.NewReader("")) | ||||
| 	if _, err := d.ContainerStatPath(ctx, container, srcPath); err != nil { | ||||
| 		return rc, moby.ContainerPathStat{}, fmt.Errorf(" %s Could not find the file %s in container %s", DRYRUN_PREFIX, srcPath, container) | ||||
| 	} | ||||
| 	return rc, moby.ContainerPathStat{}, nil | ||||
| } | ||||
| 
 | ||||
| func (d *DryRunClient) CopyToContainer(ctx context.Context, container, path string, content io.Reader, options moby.CopyToContainerOptions) error { | ||||
| 	return ErrNotImplemented | ||||
| 	if _, err := d.ContainerStatPath(ctx, container, path); err != nil { | ||||
| 		return fmt.Errorf(" %s Could not find the file %s in container %s", DRYRUN_PREFIX, path, container) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (d *DryRunClient) ImageBuild(ctx context.Context, reader io.Reader, options moby.ImageBuildOptions) (moby.ImageBuildResponse, error) { | ||||
|  |  | |||
|  | @ -67,6 +67,7 @@ func (s *composeService) MaxConcurrency(i int) { | |||
| } | ||||
| 
 | ||||
| func (s *composeService) DryRunMode(ctx context.Context, dryRun bool) (context.Context, error) { | ||||
| 	s.dryRun = dryRun | ||||
| 	if dryRun { | ||||
| 		cli, err := command.NewDockerCli() | ||||
| 		if err != nil { | ||||
|  |  | |||
|  | @ -79,10 +79,18 @@ func (s *composeService) Copy(ctx context.Context, projectName string, options a | |||
| 	} | ||||
| 
 | ||||
| 	g := errgroup.Group{} | ||||
| 	for _, container := range containers { | ||||
| 		containerID := container.ID | ||||
| 	for _, cont := range containers { | ||||
| 		container := cont | ||||
| 		g.Go(func() error { | ||||
| 			return copyFunc(ctx, containerID, srcPath, dstPath, options) | ||||
| 			if err := copyFunc(ctx, container.ID, srcPath, dstPath, options); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			fromOrInside := "inside" | ||||
| 			if direction == fromService { | ||||
| 				fromOrInside = "from" | ||||
| 			} | ||||
| 			fmt.Fprintf(s.stderr(), "Copy %s to path %s %s %s service container\n", srcPath, dstPath, fromOrInside, getCanonicalContainerName(container)) | ||||
| 			return nil | ||||
| 		}) | ||||
| 	} | ||||
| 
 | ||||
|  | @ -194,6 +202,8 @@ func (s *composeService) copyToContainer(ctx context.Context, containerID string | |||
| 		// extracted. This function also infers from the source and destination
 | ||||
| 		// info which directory to extract to, which may be the parent of the
 | ||||
| 		// destination that the user specified.
 | ||||
| 		// Don't create the archive if running in Dry Run mode
 | ||||
| 		if !s.dryRun { | ||||
| 			dstDir, preparedArchive, err := archive.PrepareArchiveCopy(srcArchive, srcInfo, dstInfo) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
|  | @ -203,6 +213,7 @@ func (s *composeService) copyToContainer(ctx context.Context, containerID string | |||
| 			resolvedDstPath = dstDir | ||||
| 			content = preparedArchive | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	options := moby.CopyToContainerOptions{ | ||||
| 		AllowOverwriteDirWithFile: false, | ||||
|  |  | |||
|  | @ -20,6 +20,8 @@ import ( | |||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 
 | ||||
| 	"github.com/docker/compose/v2/pkg/api" | ||||
| ) | ||||
| 
 | ||||
| type plainWriter struct { | ||||
|  | @ -40,7 +42,7 @@ func (p *plainWriter) Start(ctx context.Context) error { | |||
| func (p *plainWriter) Event(e Event) { | ||||
| 	prefix := "" | ||||
| 	if p.dryRun { | ||||
| 		prefix = "DRY RUN MODE - " | ||||
| 		prefix = api.DRYRUN_PREFIX | ||||
| 	} | ||||
| 	fmt.Fprintln(p.out, prefix, e.ID, e.Text, e.StatusText) | ||||
| } | ||||
|  | @ -54,7 +56,7 @@ func (p *plainWriter) Events(events []Event) { | |||
| func (p *plainWriter) TailMsgf(m string, args ...interface{}) { | ||||
| 	prefix := "" | ||||
| 	if p.dryRun { | ||||
| 		prefix = DRYRUN_PREFIX | ||||
| 		prefix = api.DRYRUN_PREFIX | ||||
| 	} | ||||
| 	fmt.Fprintln(p.out, append([]interface{}{prefix, m}, args...)...) | ||||
| } | ||||
|  |  | |||
|  | @ -25,6 +25,7 @@ import ( | |||
| 	"sync" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/docker/compose/v2/pkg/api" | ||||
| 	"github.com/docker/compose/v2/pkg/utils" | ||||
| 
 | ||||
| 	"github.com/buger/goterm" | ||||
|  | @ -110,7 +111,7 @@ func (w *ttyWriter) TailMsgf(msg string, args ...interface{}) { | |||
| 	defer w.mtx.Unlock() | ||||
| 	msgWithPrefix := msg | ||||
| 	if w.dryRun { | ||||
| 		msgWithPrefix = strings.TrimSpace(DRYRUN_PREFIX + msg) | ||||
| 		msgWithPrefix = strings.TrimSpace(api.DRYRUN_PREFIX + msg) | ||||
| 	} | ||||
| 	w.tailEvents = append(w.tailEvents, fmt.Sprintf(msgWithPrefix, args...)) | ||||
| } | ||||
|  | @ -206,7 +207,7 @@ func lineText(event Event, pad string, terminalWidth, statusPadding int, color b | |||
| 	} | ||||
| 	prefix := "" | ||||
| 	if dryRun { | ||||
| 		prefix = DRYRUN_PREFIX | ||||
| 		prefix = api.DRYRUN_PREFIX | ||||
| 	} | ||||
| 
 | ||||
| 	elapsed := endTime.Sub(event.startTime).Seconds() | ||||
|  |  | |||
|  | @ -28,10 +28,6 @@ import ( | |||
| 	"golang.org/x/sync/errgroup" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	DRYRUN_PREFIX = " DRY-RUN MODE - " | ||||
| ) | ||||
| 
 | ||||
| // Writer can write multiple progress events
 | ||||
| type Writer interface { | ||||
| 	Start(context.Context) error | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue