func (b *buildFile) CmdAdd(args string) error { if b.context == "" { return fmt.Errorf("No context given. Impossible to use ADD") } tmp := strings.SplitN(args, " ", 2) if len(tmp) != 2 { return fmt.Errorf("Invalid INSERT format") } orig := strings.Trim(tmp[0], " ") dest := strings.Trim(tmp[1], " ") b.config.Cmd = []string{"echo", "PUSH", orig, "in", dest} cid, err := b.run() if err != nil { return err } container := b.runtime.Get(cid) if container == nil { return fmt.Errorf("Error while creating the container (CmdAdd)") } if err := os.MkdirAll(path.Join(container.rwPath(), dest), 0700); err != nil { return err } origPath := path.Join(b.context, orig) destPath := path.Join(container.rwPath(), dest) fi, err := os.Stat(origPath) if err != nil { return err } if fi.IsDir() { files, err := ioutil.ReadDir(path.Join(b.context, orig)) if err != nil { return err } for _, fi := range files { if err := utils.CopyDirectory(path.Join(origPath, fi.Name()), path.Join(destPath, fi.Name())); err != nil { return err } } } else { if err := utils.CopyDirectory(origPath, destPath); err != nil { return err } } return b.commit(cid) }
func newTestRuntime(prefix string) (runtime *Runtime, err error) { if prefix == "" { prefix = "docker-test-" } utils.Debugf("prefix = %s", prefix) utils.Debugf("newTestRuntime start") root, err := ioutil.TempDir("", prefix) defer func() { utils.Debugf("newTestRuntime: %s", root) }() if err != nil { return nil, err } if err := os.Remove(root); err != nil { return nil, err } if err := utils.CopyDirectory(unitTestStoreBase, root); err != nil { return nil, err } config := &DaemonConfig{ GraphPath: root, AutoRestart: false, } runtime, err = NewRuntimeFromDirectory(config) if err != nil { return nil, err } runtime.UpdateCapabilities(true) return runtime, nil }
func newTestDirectory(templateDir string) (dir string, err error) { if globalTestID == "" { globalTestID = GenerateID()[:4] } prefix := fmt.Sprintf("docker-test%s-%s-", globalTestID, getCallerName(2)) if prefix == "" { prefix = "docker-test-" } dir, err = ioutil.TempDir("", prefix) if err = os.Remove(dir); err != nil { return } if err = utils.CopyDirectory(templateDir, dir); err != nil { return } return }
func newTestRuntime() (*Runtime, error) { root, err := ioutil.TempDir("", "docker-test") if err != nil { return nil, err } if err := os.Remove(root); err != nil { return nil, err } if err := utils.CopyDirectory(unitTestStoreBase, root); err != nil { return nil, err } runtime, err := NewRuntimeFromDirectory(root, false) if err != nil { return nil, err } runtime.UpdateCapabilities(true) return runtime, nil }
func TestRestore(t *testing.T) { root, err := ioutil.TempDir("", "docker-test") if err != nil { t.Fatal(err) } if err := os.Remove(root); err != nil { t.Fatal(err) } if err := utils.CopyDirectory(unitTestStoreBase, root); err != nil { t.Fatal(err) } runtime1, err := NewRuntimeFromDirectory(root, false) if err != nil { t.Fatal(err) } builder := NewBuilder(runtime1) // Create a container with one instance of docker container1, err := builder.Create(&Config{ Image: GetTestImage(runtime1).ID, Cmd: []string{"ls", "-al"}, }, ) if err != nil { t.Fatal(err) } defer runtime1.Destroy(container1) // Create a second container meant to be killed container2, err := builder.Create(&Config{ Image: GetTestImage(runtime1).ID, Cmd: []string{"/bin/cat"}, OpenStdin: true, }, ) if err != nil { t.Fatal(err) } defer runtime1.Destroy(container2) // Start the container non blocking if err := container2.Start(); err != nil { t.Fatal(err) } if !container2.State.Running { t.Fatalf("Container %v should appear as running but isn't", container2.ID) } // Simulate a crash/manual quit of dockerd: process dies, states stays 'Running' cStdin, _ := container2.StdinPipe() cStdin.Close() if err := container2.WaitTimeout(2 * time.Second); err != nil { t.Fatal(err) } container2.State.Running = true container2.ToDisk() if len(runtime1.List()) != 2 { t.Errorf("Expected 2 container, %v found", len(runtime1.List())) } if err := container1.Run(); err != nil { t.Fatal(err) } if !container2.State.Running { t.Fatalf("Container %v should appear as running but isn't", container2.ID) } // Here are are simulating a docker restart - that is, reloading all containers // from scratch runtime2, err := NewRuntimeFromDirectory(root, false) if err != nil { t.Fatal(err) } defer nuke(runtime2) if len(runtime2.List()) != 2 { t.Errorf("Expected 2 container, %v found", len(runtime2.List())) } runningCount := 0 for _, c := range runtime2.List() { if c.State.Running { t.Errorf("Running container found: %v (%v)", c.ID, c.Path) runningCount++ } } if runningCount != 0 { t.Fatalf("Expected 0 container alive, %d found", runningCount) } container3 := runtime2.Get(container1.ID) if container3 == nil { t.Fatal("Unable to Get container") } if err := container3.Run(); err != nil { t.Fatal(err) } container2.State.Running = false }
func (b *buildFile) CmdAdd(args string) error { if b.context == "" { return fmt.Errorf("No context given. Impossible to use ADD") } tmp := strings.SplitN(args, " ", 2) if len(tmp) != 2 { return fmt.Errorf("Invalid ADD format") } orig := strings.Trim(tmp[0], " ") dest := strings.Trim(tmp[1], " ") cmd := b.config.Cmd b.config.Cmd = []string{"/bin/sh", "-c", fmt.Sprintf("#(nop) ADD %s in %s", orig, dest)} cid, err := b.run() if err != nil { return err } container := b.runtime.Get(cid) if container == nil { return fmt.Errorf("Error while creating the container (CmdAdd)") } if err := container.EnsureMounted(); err != nil { return err } defer container.Unmount() origPath := path.Join(b.context, orig) destPath := path.Join(container.RootfsPath(), dest) fi, err := os.Stat(origPath) if err != nil { return err } if fi.IsDir() { if err := os.MkdirAll(destPath, 0700); err != nil { return err } files, err := ioutil.ReadDir(path.Join(b.context, orig)) if err != nil { return err } for _, fi := range files { if err := utils.CopyDirectory(path.Join(origPath, fi.Name()), path.Join(destPath, fi.Name())); err != nil { return err } } } else { if err := os.MkdirAll(path.Dir(destPath), 0700); err != nil { return err } if err := utils.CopyDirectory(origPath, destPath); err != nil { return err } } if err := b.commit(cid, cmd, fmt.Sprintf("ADD %s in %s", orig, dest)); err != nil { return err } b.config.Cmd = cmd return nil }