go通过docker sdk将容器中的文件或者文件夹复制到本地

第一步:需要创建docker客户端

第二步:将文件复制出来,但是复制出来的文件无论文件还是文件夹都会是tar存档的形式

第三步:解包

package main

import (
	"archive/tar"
	"context"
	"fmt"
	"io"
	"os"
	"path/filepath"

	"github.com/docker/docker/client"
)

func main() {
	// 设置远程Docker守护进程的地址(包括协议和端口号)
	remoteDockerHost := "tcp://10.0.0.12:2376"

	// 创建Docker客户端并指定远程Docker守护进程地址
	cli, err := client.NewClientWithOpts(
		client.WithHost(remoteDockerHost),
		// client.WithVersion("1.41"),
		client.WithAPIVersionNegotiation(),
		client.WithTLSClientConfig("cert/ca.pem", "cert/cert.pem", "cert/key.pem"),
	)
	if err != nil {
		fmt.Println("创建容器失败:", err)
		return
	}
	containerID := "nginx"                 // 要复制文件的容器ID
	sourcePath := "/usr/share/nginx/html/" // 要复制的容器内文件或目录的路径

	// 使用cli.CopyFromContainer方法复制容器中的文件到本地文件
	reader, stat, err := cli.CopyFromContainer(context.Background(), containerID, sourcePath)
	if err != nil {
		fmt.Println("复制容器中的文件出错:", err)
		return
	}
	defer reader.Close()

	// 打印从容器中复制的文件的元数据
	fmt.Println("文件元数据:", stat)
	//解包
	// 创建tar.Reader来读取tar包
	tarReader := tar.NewReader(reader)

	// 解压缩tar包中的内容到本地文件系统
	for {
		header, err := tarReader.Next()
		if err == io.EOF {
			break // 读取完毕,退出循环
		}
		if err != nil {
			fmt.Println("读取tar头部信息出错:", err)
			return
		}

		// 获取解压后的文件名
		filename := filepath.Join("./", header.Name)

		// 根据Header中的Typeflag标志进行相应处理
		switch header.Typeflag {
		case tar.TypeDir:
			// 如果是文件夹,则创建本地文件夹
			err = os.MkdirAll(filename, os.ModePerm)
			if err != nil {
				fmt.Println("创建本地文件夹出错:", err)
				return
			}
			fmt.Println("解压文件夹:", filename)

		case tar.TypeReg:
			// 如果是文件,则创建本地文件,写入解压后的内容
			localFile, err := os.Create(filename)
			if err != nil {
				fmt.Println("创建本地文件出错:", err)
				return
			}
			defer localFile.Close()

			// 将tar包中的内容写入本地文件
			_, err = io.Copy(localFile, tarReader)
			if err != nil {
				fmt.Println("写入本地文件出错:", err)
				return
			}
			fmt.Println("解压文件:", filename)

		default:
			// 忽略其他类型的条目
			fmt.Println("忽略未知类型的条目:", header.Name)
		}
	}
	fmt.Println("tar包解压缩成功!")
	fmt.Println("文件复制成功!")
}
posted @ 2023-07-20 12:13  厚礼蝎  阅读(111)  评论(0编辑  收藏  举报