fix podman cp can create an extra directory level
Signed-off-by: zhangguanzhang <zhangguanzhang@qq.com>
This commit is contained in:
		
							parent
							
								
									3218736cff
								
							
						
					
					
						commit
						9d293bd2de
					
				| 
						 | 
				
			
			@ -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 /
 | 
			
		||||
| 
						 | 
				
			
			@ -294,4 +294,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