docker_cli_import_test.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package main
  2. import (
  3. "bufio"
  4. "compress/gzip"
  5. "os"
  6. "os/exec"
  7. "regexp"
  8. "strings"
  9. "testing"
  10. "github.com/docker/docker/integration-cli/cli"
  11. "gotest.tools/v3/assert"
  12. "gotest.tools/v3/icmd"
  13. )
  14. func (s *DockerSuite) TestImportDisplay(c *testing.T) {
  15. testRequires(c, DaemonIsLinux)
  16. out, _ := dockerCmd(c, "run", "-d", "busybox", "true")
  17. cleanedContainerID := strings.TrimSpace(out)
  18. out, err := RunCommandPipelineWithOutput(
  19. exec.Command(dockerBinary, "export", cleanedContainerID),
  20. exec.Command(dockerBinary, "import", "-"),
  21. )
  22. assert.NilError(c, err)
  23. assert.Assert(c, strings.Count(out, "\n") == 1, "display is expected 1 '\\n' but didn't")
  24. image := strings.TrimSpace(out)
  25. out, _ = dockerCmd(c, "run", "--rm", image, "true")
  26. assert.Equal(c, out, "", "command output should've been nothing.")
  27. }
  28. func (s *DockerSuite) TestImportBadURL(c *testing.T) {
  29. out, _, err := dockerCmdWithError("import", "http://nourl/bad")
  30. assert.Assert(c, err != nil, "import was supposed to fail but didn't")
  31. // Depending on your system you can get either of these errors
  32. if !strings.Contains(out, "dial tcp") &&
  33. !strings.Contains(out, "ApplyLayer exit status 1 stdout: stderr: archive/tar: invalid tar header") &&
  34. !strings.Contains(out, "Error processing tar file") {
  35. c.Fatalf("expected an error msg but didn't get one.\nErr: %v\nOut: %v", err, out)
  36. }
  37. }
  38. func (s *DockerSuite) TestImportFile(c *testing.T) {
  39. testRequires(c, DaemonIsLinux)
  40. dockerCmd(c, "run", "--name", "test-import", "busybox", "true")
  41. temporaryFile, err := os.CreateTemp("", "exportImportTest")
  42. assert.Assert(c, err == nil, "failed to create temporary file")
  43. defer os.Remove(temporaryFile.Name())
  44. icmd.RunCmd(icmd.Cmd{
  45. Command: []string{dockerBinary, "export", "test-import"},
  46. Stdout: bufio.NewWriter(temporaryFile),
  47. }).Assert(c, icmd.Success)
  48. out, _ := dockerCmd(c, "import", temporaryFile.Name())
  49. assert.Assert(c, strings.Count(out, "\n") == 1, "display is expected 1 '\\n' but didn't")
  50. image := strings.TrimSpace(out)
  51. out, _ = dockerCmd(c, "run", "--rm", image, "true")
  52. assert.Equal(c, out, "", "command output should've been nothing.")
  53. }
  54. func (s *DockerSuite) TestImportGzipped(c *testing.T) {
  55. testRequires(c, DaemonIsLinux)
  56. dockerCmd(c, "run", "--name", "test-import", "busybox", "true")
  57. temporaryFile, err := os.CreateTemp("", "exportImportTest")
  58. assert.Assert(c, err == nil, "failed to create temporary file")
  59. defer os.Remove(temporaryFile.Name())
  60. w := gzip.NewWriter(temporaryFile)
  61. icmd.RunCmd(icmd.Cmd{
  62. Command: []string{dockerBinary, "export", "test-import"},
  63. Stdout: w,
  64. }).Assert(c, icmd.Success)
  65. assert.Assert(c, w.Close() == nil, "failed to close gzip writer")
  66. temporaryFile.Close()
  67. out, _ := dockerCmd(c, "import", temporaryFile.Name())
  68. assert.Assert(c, strings.Count(out, "\n") == 1, "display is expected 1 '\\n' but didn't")
  69. image := strings.TrimSpace(out)
  70. out, _ = dockerCmd(c, "run", "--rm", image, "true")
  71. assert.Equal(c, out, "", "command output should've been nothing.")
  72. }
  73. func (s *DockerSuite) TestImportFileWithMessage(c *testing.T) {
  74. testRequires(c, DaemonIsLinux)
  75. dockerCmd(c, "run", "--name", "test-import", "busybox", "true")
  76. temporaryFile, err := os.CreateTemp("", "exportImportTest")
  77. assert.Assert(c, err == nil, "failed to create temporary file")
  78. defer os.Remove(temporaryFile.Name())
  79. icmd.RunCmd(icmd.Cmd{
  80. Command: []string{dockerBinary, "export", "test-import"},
  81. Stdout: bufio.NewWriter(temporaryFile),
  82. }).Assert(c, icmd.Success)
  83. message := "Testing commit message"
  84. out, _ := dockerCmd(c, "import", "-m", message, temporaryFile.Name())
  85. assert.Assert(c, strings.Count(out, "\n") == 1, "display is expected 1 '\\n' but didn't")
  86. image := strings.TrimSpace(out)
  87. out, _ = dockerCmd(c, "history", image)
  88. split := strings.Split(out, "\n")
  89. assert.Equal(c, len(split), 3, "expected 3 lines from image history")
  90. r := regexp.MustCompile(`[\s]{2,}`)
  91. split = r.Split(split[1], -1)
  92. assert.Equal(c, message, split[3], "didn't get expected value in commit message")
  93. out, _ = dockerCmd(c, "run", "--rm", image, "true")
  94. assert.Equal(c, out, "", "command output should've been nothing")
  95. }
  96. func (s *DockerSuite) TestImportFileNonExistentFile(c *testing.T) {
  97. _, _, err := dockerCmdWithError("import", "example.com/myImage.tar")
  98. assert.Assert(c, err != nil, "import non-existing file must failed")
  99. }
  100. func (s *DockerSuite) TestImportWithQuotedChanges(c *testing.T) {
  101. testRequires(c, DaemonIsLinux)
  102. cli.DockerCmd(c, "run", "--name", "test-import", "busybox", "true")
  103. temporaryFile, err := os.CreateTemp("", "exportImportTest")
  104. assert.Assert(c, err == nil, "failed to create temporary file")
  105. defer os.Remove(temporaryFile.Name())
  106. cli.Docker(cli.Args("export", "test-import"), cli.WithStdout(bufio.NewWriter(temporaryFile))).Assert(c, icmd.Success)
  107. result := cli.DockerCmd(c, "import", "-c", `ENTRYPOINT ["/bin/sh", "-c"]`, temporaryFile.Name())
  108. image := strings.TrimSpace(result.Stdout())
  109. result = cli.DockerCmd(c, "run", "--rm", image, "true")
  110. result.Assert(c, icmd.Expected{Out: icmd.None})
  111. }