func createDevices(rootDir string, uid, gid int) error { nullDir := fp.Join(rootDir, os.DevNull) if err := osutil.Mknod(nullDir, syscall.S_IFCHR|uint32(os.FileMode(0666)), 1*256+3); err != nil { return err } if err := os.Lchown(nullDir, uid, gid); err != nil { return errwrap.Wrapff(err, "Failed to lchown %s: {{err}}", nullDir) } zeroDir := fp.Join(rootDir, "/dev/zero") if err := osutil.Mknod(zeroDir, syscall.S_IFCHR|uint32(os.FileMode(0666)), 1*256+3); err != nil { return err } if err := os.Lchown(zeroDir, uid, gid); err != nil { return errwrap.Wrapff(err, "Failed to lchown %s:", zeroDir) } for _, f := range []string{"/dev/random", "/dev/urandom"} { randomDir := fp.Join(rootDir, f) if err := osutil.Mknod(randomDir, syscall.S_IFCHR|uint32(os.FileMode(0666)), 1*256+9); err != nil { return err } if err := os.Lchown(randomDir, uid, gid); err != nil { return errwrap.Wrapff(err, "Failed to lchown %s: {{err}}", randomDir) } } return nil }
func (c *Client) ExportImage(imageID string) (io.ReadCloser, error) { container, err := c.docker.CreateContainer(godocker.CreateContainerOptions{ Config: &godocker.Config{ Image: imageID, }, }) if err != nil { return nil, errwrap.Wrapff(err, "Failed to create container (imageID:%s): {{err}}", imageID) } pReader, pWriter := io.Pipe() go func() { defer func() { c.docker.RemoveContainer(godocker.RemoveContainerOptions{ ID: container.ID, Force: true, }) }() err := c.docker.ExportContainer(godocker.ExportContainerOptions{ ID: container.ID, OutputStream: pWriter, }) if err != nil { err = errwrap.Wrapff(err, "Failed to export container %s: {{err}}", container.ID) pWriter.CloseWithError(err) } else { pWriter.Close() } }() return pReader, nil }
func bindMount(bindDir string, rootDir string, readonly bool) error { var srcDir, destDir string d := strings.SplitN(bindDir, ":", 2) if len(d) < 2 { srcDir = d[0] } else { srcDir, destDir = d[0], d[1] } if destDir == "" { destDir = srcDir } ok, err := osutil.IsDirEmpty(srcDir) if err != nil { return err } if ok { if _, err := os.Create(fp.Join(srcDir, ".droot.keep")); err != nil { return errwrap.Wrapf(err, "Failed to create .droot.keep: {{err}}") } } containerDir := fp.Join(rootDir, destDir) if err := fileutils.CreateIfNotExists(containerDir, true); err != nil { // mkdir -p return errwrap.Wrapff(err, "Failed to create directory: %s: {{err}}", containerDir) } ok, err = osutil.IsDirEmpty(containerDir) if err != nil { return err } if ok { log.Debug("bind mount", bindDir, "to", containerDir) if err := mount.Mount(srcDir, containerDir, "none", "bind,rw"); err != nil { return errwrap.Wrapff(err, "Failed to bind mount %s: {{err}}", containerDir) } if readonly { log.Debug("robind mount", bindDir, "to", containerDir) if err := mount.Mount(srcDir, containerDir, "none", "remount,ro,bind"); err != nil { return errwrap.Wrapff(err, "Failed to robind mount %s: {{err}}", containerDir) } } } return nil }
func (clt *S3Client) ExistsBucket(bucket string) (bool, error) { _, err := clt.svc.ListObjects(&s3.ListObjectsInput{ Bucket: &bucket, }) if err != nil { return false, errwrap.Wrapff(err, "Failed to list s3 objects %s: {{err}}", bucket) } return true, nil }