github.com/toplink-cn/moby@v0.0.0-20240305205811-460b4aebdf81/integration-cli/docker_cli_import_test.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "compress/gzip" 6 "context" 7 "os" 8 "os/exec" 9 "regexp" 10 "strings" 11 "testing" 12 13 "github.com/docker/docker/integration-cli/cli" 14 "gotest.tools/v3/assert" 15 "gotest.tools/v3/icmd" 16 ) 17 18 type DockerCLIImportSuite struct { 19 ds *DockerSuite 20 } 21 22 func (s *DockerCLIImportSuite) TearDownTest(ctx context.Context, c *testing.T) { 23 s.ds.TearDownTest(ctx, c) 24 } 25 26 func (s *DockerCLIImportSuite) OnTimeout(c *testing.T) { 27 s.ds.OnTimeout(c) 28 } 29 30 func (s *DockerCLIImportSuite) TestImportDisplay(c *testing.T) { 31 testRequires(c, DaemonIsLinux) 32 cID := cli.DockerCmd(c, "run", "-d", "busybox", "true").Stdout() 33 cID = strings.TrimSpace(cID) 34 35 out, err := RunCommandPipelineWithOutput( 36 exec.Command(dockerBinary, "export", cID), 37 exec.Command(dockerBinary, "import", "-"), 38 ) 39 assert.NilError(c, err) 40 41 assert.Assert(c, strings.Count(out, "\n") == 1, "display is expected 1 '\\n' but didn't") 42 43 imgRef := strings.TrimSpace(out) 44 out = cli.DockerCmd(c, "run", "--rm", imgRef, "true").Combined() 45 assert.Equal(c, out, "", "command output should've been nothing.") 46 } 47 48 func (s *DockerCLIImportSuite) TestImportBadURL(c *testing.T) { 49 out, _, err := dockerCmdWithError("import", "https://nosuchdomain.invalid/bad") 50 assert.Assert(c, err != nil, "import was supposed to fail but didn't") 51 // Depending on your system you can get either of these errors 52 if !strings.Contains(out, "dial tcp") && 53 !strings.Contains(out, "ApplyLayer exit status 1 stdout: stderr: archive/tar: invalid tar header") && 54 !strings.Contains(out, "Error processing tar file") { 55 c.Fatalf("expected an error msg but didn't get one.\nErr: %v\nOut: %v", err, out) 56 } 57 } 58 59 func (s *DockerCLIImportSuite) TestImportFile(c *testing.T) { 60 testRequires(c, DaemonIsLinux) 61 cli.DockerCmd(c, "run", "--name", "test-import", "busybox", "true") 62 63 temporaryFile, err := os.CreateTemp("", "exportImportTest") 64 assert.Assert(c, err == nil, "failed to create temporary file") 65 defer os.Remove(temporaryFile.Name()) 66 67 icmd.RunCmd(icmd.Cmd{ 68 Command: []string{dockerBinary, "export", "test-import"}, 69 Stdout: bufio.NewWriter(temporaryFile), 70 }).Assert(c, icmd.Success) 71 72 out := cli.DockerCmd(c, "import", temporaryFile.Name()).Combined() 73 assert.Assert(c, strings.Count(out, "\n") == 1, "display is expected 1 '\\n' but didn't") 74 imgRef := strings.TrimSpace(out) 75 76 out = cli.DockerCmd(c, "run", "--rm", imgRef, "true").Combined() 77 assert.Equal(c, out, "", "command output should've been nothing.") 78 } 79 80 func (s *DockerCLIImportSuite) TestImportGzipped(c *testing.T) { 81 testRequires(c, DaemonIsLinux) 82 cli.DockerCmd(c, "run", "--name", "test-import", "busybox", "true") 83 84 temporaryFile, err := os.CreateTemp("", "exportImportTest") 85 assert.Assert(c, err == nil, "failed to create temporary file") 86 defer os.Remove(temporaryFile.Name()) 87 88 w := gzip.NewWriter(temporaryFile) 89 icmd.RunCmd(icmd.Cmd{ 90 Command: []string{dockerBinary, "export", "test-import"}, 91 Stdout: w, 92 }).Assert(c, icmd.Success) 93 assert.Assert(c, w.Close() == nil, "failed to close gzip writer") 94 temporaryFile.Close() 95 out := cli.DockerCmd(c, "import", temporaryFile.Name()).Combined() 96 assert.Assert(c, strings.Count(out, "\n") == 1, "display is expected 1 '\\n' but didn't") 97 imgRef := strings.TrimSpace(out) 98 99 out = cli.DockerCmd(c, "run", "--rm", imgRef, "true").Combined() 100 assert.Equal(c, out, "", "command output should've been nothing.") 101 } 102 103 func (s *DockerCLIImportSuite) TestImportFileWithMessage(c *testing.T) { 104 testRequires(c, DaemonIsLinux) 105 cli.DockerCmd(c, "run", "--name", "test-import", "busybox", "true") 106 107 temporaryFile, err := os.CreateTemp("", "exportImportTest") 108 assert.Assert(c, err == nil, "failed to create temporary file") 109 defer os.Remove(temporaryFile.Name()) 110 111 icmd.RunCmd(icmd.Cmd{ 112 Command: []string{dockerBinary, "export", "test-import"}, 113 Stdout: bufio.NewWriter(temporaryFile), 114 }).Assert(c, icmd.Success) 115 116 message := "Testing commit message" 117 out := cli.DockerCmd(c, "import", "-m", message, temporaryFile.Name()).Combined() 118 assert.Assert(c, strings.Count(out, "\n") == 1, "display is expected 1 '\\n' but didn't") 119 imgRef := strings.TrimSpace(out) 120 121 out = cli.DockerCmd(c, "history", imgRef).Combined() 122 split := strings.Split(out, "\n") 123 124 assert.Equal(c, len(split), 3, "expected 3 lines from image history") 125 r := regexp.MustCompile(`[\s]{2,}`) 126 split = r.Split(split[1], -1) 127 128 assert.Equal(c, message, split[3], "didn't get expected value in commit message") 129 130 out = cli.DockerCmd(c, "run", "--rm", imgRef, "true").Combined() 131 assert.Equal(c, out, "", "command output should've been nothing") 132 } 133 134 func (s *DockerCLIImportSuite) TestImportFileNonExistentFile(c *testing.T) { 135 _, _, err := dockerCmdWithError("import", "example.com/myImage.tar") 136 assert.Assert(c, err != nil, "import non-existing file must failed") 137 } 138 139 func (s *DockerCLIImportSuite) TestImportWithQuotedChanges(c *testing.T) { 140 testRequires(c, DaemonIsLinux) 141 cli.DockerCmd(c, "run", "--name", "test-import", "busybox", "true") 142 143 temporaryFile, err := os.CreateTemp("", "exportImportTest") 144 assert.Assert(c, err == nil, "failed to create temporary file") 145 defer os.Remove(temporaryFile.Name()) 146 147 cli.Docker(cli.Args("export", "test-import"), cli.WithStdout(bufio.NewWriter(temporaryFile))).Assert(c, icmd.Success) 148 149 result := cli.DockerCmd(c, "import", "-c", `ENTRYPOINT ["/bin/sh", "-c"]`, temporaryFile.Name()) 150 imgRef := strings.TrimSpace(result.Stdout()) 151 152 result = cli.DockerCmd(c, "run", "--rm", imgRef, "true") 153 result.Assert(c, icmd.Expected{Out: icmd.None}) 154 }