code: func (cli *Client) CopyFromContainer(ctx context.Context, containerID, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) {
  	query := make(url.Values, 1)
  	query.Set("path", filepath.ToSlash(srcPath)) // Normalize the paths used in the API.
  
  	apiPath := "/containers/" + containerID + "/archive"
  	response, err := cli.get(ctx, apiPath, query, nil)
  	if err != nil {
  		return nil, types.ContainerPathStat{}, wrapResponseError(err, response, "container:path", containerID+":"+srcPath)
  	}
  
  	// TODO this code converts non-error status-codes (e.g., "204 No Content") into an error; verify if this is the desired behavior
  	if response.statusCode != http.StatusOK {
  		return nil, types.ContainerPathStat{}, fmt.Errorf("unexpected status code from daemon: %d", response.statusCode)
  	}
  
  	// In order to get the copy behavior right, we need to know information
  	// about both the source and the destination. The response headers include
  	// stat info about the source that we can use in deciding exactly how to
  	// copy it locally. Along with the stat info about the local destination,
  	// we have everything we need to handle the multiple possibilities there
  	// can be when copying a file/dir from one location to another file/dir.
  	stat, err := getContainerPathStatFromHeader(response.header)
  	if err != nil {
  		return nil, stat, fmt.Errorf("unable to get resource stat from response: %s", err)
  	}
  	return response.body, stat, err
  }
docs: // CopyFromContainer gets the content from the container and returns it as a Reader
  // for a TAR archive to manipulate it in the host. It's up to the caller to close the reader.