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("文件复制成功!")
}
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/17567988.html