将文件从Golang中的Docker镜像拖到本地文件系统

我试图找出如何使用Go客户端( http://godoc.org/github.com/moby/moby/client )从特定版本(标签)的docker镜像中提取文件,

我想下载图像,然后将图像中的文件复制到本地文件系统。 我看到很多处理图像的命令,但不知道如何访问它的内容。 我确实看到了访问容器内容的方法。

我怀疑我需要下载图像,与图像创build一个容器,并最终复制容器中的内容。 虽然如果我可以避免创build一个容器,那将是首选。

有谁知道如何做到这一点? 代码片断将不胜感激。

谢谢!

您必须启动容器,复制文件,然后移除容器…由于容器无法启动,因此这不是一个非常昂贵的操作。

下面是一个工作示例,将指定映像中的文件复制到标准输出。 API很简单:

https://gist.github.com/ricardobranco777/a3be772935dfb1a183e0831496925585

package main import ( "archive/tar" "fmt" "io" "io/ioutil" "os" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/client" "golang.org/x/net/context" ) func main() { if len(os.Args) != 3 { fmt.Fprintf(os.Stderr, "Usage: %s IMAGE FILE\n", os.Args[0]) os.Exit(1) } imageName := os.Args[1] filePath := os.Args[2] ctx := context.Background() cli, err := client.NewEnvClient() if err != nil { panic(err) } out, err := cli.ImagePull(ctx, imageName, types.ImagePullOptions{}) if err != nil { panic(err) } defer out.Close() if _, err := ioutil.ReadAll(out); err != nil { panic(err) } info, err := cli.ContainerCreate(ctx, &container.Config{ Image: imageName, }, nil, nil, "") if err != nil { panic(err) } tarStream, _, err := cli.CopyFromContainer(ctx, info.ID, filePath) if err != nil { panic(err) } tr := tar.NewReader(tarStream) if _, err := tr.Next(); err != nil { panic(err) } io.Copy(os.Stdout, tr) if err := cli.ContainerRemove(ctx, info.ID, types.ContainerRemoveOptions{}); err != nil { panic(err) } }