mirror of https://github.com/containers/podman.git
				
				
				
			Merge pull request #6601 from zhangguanzhang/podman-cp-dir
fix podman cp can create an extra directory when the source is the container's root directory
This commit is contained in:
		
						commit
						5a82a559c6
					
				|  | @ -260,7 +260,19 @@ func containerCopy(srcPath, destPath, src, dest string, idMappingOpts storage.ID | |||
| 	if srcfi.IsDir() { | ||||
| 		logrus.Debugf("copying %q to %q", srcPath+string(os.PathSeparator)+"*", dest+string(os.PathSeparator)+"*") | ||||
| 		if destDirIsExist && !strings.HasSuffix(src, fmt.Sprintf("%s.", string(os.PathSeparator))) { | ||||
| 			destPath = filepath.Join(destPath, filepath.Base(srcPath)) | ||||
| 			srcPathBase := filepath.Base(srcPath) | ||||
| 			if !isFromHostToCtr { | ||||
| 				pathArr := strings.SplitN(src, ":", 2) | ||||
| 				if len(pathArr) != 2 { | ||||
| 					return errors.Errorf("invalid arguments %s, you must specify source path", src) | ||||
| 				} | ||||
| 				if pathArr[1] == "/" { | ||||
| 					// If `srcPath` is the root directory of the container,
 | ||||
| 					// `srcPath` will be `.../${sha256_ID}/merged/`, so do not join it
 | ||||
| 					srcPathBase = "" | ||||
| 				} | ||||
| 			} | ||||
| 			destPath = filepath.Join(destPath, srcPathBase) | ||||
| 		} | ||||
| 		if err = copyWithTar(srcPath, destPath); err != nil { | ||||
| 			return errors.Wrapf(err, "error copying %q to %q", srcPath, dest) | ||||
|  |  | |||
|  | @ -0,0 +1,2 @@ | |||
| FROM scratch | ||||
| COPY Dockerfile.test-cp-root-dir / | ||||
|  | @ -296,4 +296,42 @@ var _ = Describe("Podman cp", func() { | |||
| 
 | ||||
| 		os.Remove("testfile1") | ||||
| 	}) | ||||
| 	It("podman cp the root directory from the ctr to an existing directory on the host ", func() { | ||||
| 		imgName := "test-cp-root-dir:latest" | ||||
| 		DockerfileName := "Dockerfile.test-cp-root-dir" | ||||
| 		ctrName := "test-container-cp-root" | ||||
| 
 | ||||
| 		session := podmanTest.PodmanNoCache([]string{"build", "-f", "build/" + DockerfileName, "-t", imgName, "build/"}) | ||||
| 		session.WaitWithDefaultTimeout() | ||||
| 		Expect(session.ExitCode()).To(Equal(0)) | ||||
| 
 | ||||
| 		testDirPath := filepath.Join(podmanTest.RunRoot, "TestDirForCp") | ||||
| 
 | ||||
| 		session = podmanTest.Podman([]string{"create", "--name", ctrName, imgName, "dummy"}) | ||||
| 		session.WaitWithDefaultTimeout() | ||||
| 		Expect(session.ExitCode()).To(Equal(0)) | ||||
| 
 | ||||
| 		err := os.Mkdir(testDirPath, 0755) | ||||
| 		Expect(err).To(BeNil()) | ||||
| 		defer os.RemoveAll(testDirPath) | ||||
| 
 | ||||
| 		// Copy the root directory of the container to an existing directory
 | ||||
| 		session = podmanTest.Podman([]string{"cp", ctrName + ":/", testDirPath}) | ||||
| 		session.WaitWithDefaultTimeout() | ||||
| 		Expect(session.ExitCode()).To(Equal(0)) | ||||
| 
 | ||||
| 		// The file should be in the directory,
 | ||||
| 		// not one layer too much of the directory called merged
 | ||||
| 		checkFile := filepath.Join(testDirPath, DockerfileName) | ||||
| 		_, err = os.Stat(checkFile) | ||||
| 		Expect(err).To(BeNil()) | ||||
| 
 | ||||
| 		session = podmanTest.Podman([]string{"container", "rm", ctrName}) | ||||
| 		session.WaitWithDefaultTimeout() | ||||
| 		Expect(session.ExitCode()).To(Equal(0)) | ||||
| 
 | ||||
| 		session = podmanTest.PodmanNoCache([]string{"rmi", "-f", imgName}) | ||||
| 		session.WaitWithDefaultTimeout() | ||||
| 		Expect(session.ExitCode()).To(Equal(0)) | ||||
| 	}) | ||||
| }) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue