// imageFSMetadata creates a container and reads the filesystem metadata out of the archive. func imageFSMetadata(c *docker.Client, name string) (map[string]*tar.Header, error) { container, err := c.CreateContainer(docker.CreateContainerOptions{Name: name + "-export", Config: &docker.Config{Image: name}}) if err != nil { return nil, err } defer c.RemoveContainer(docker.RemoveContainerOptions{ID: container.ID, RemoveVolumes: true, Force: true}) ch := make(chan struct{}) result := make(map[string]*tar.Header) r, w := io.Pipe() go func() { defer close(ch) out := tar.NewReader(r) for { h, err := out.Next() if err != nil { if err == io.EOF { w.Close() } else { w.CloseWithError(err) } break } result[h.Name] = h } }() if err := c.ExportContainer(docker.ExportContainerOptions{ID: container.ID, OutputStream: w}); err != nil { return nil, err } <-ch return result, nil }