首页 > 其他分享 >go通过docker sdk将容器中的文件或者文件夹复制到本地

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

时间:2023-07-20 12:22:04浏览次数:44  
标签:复制到 文件 tar err fmt Println 本地 go docker

第一步:需要创建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("文件复制成功!")
}

标签:复制到,文件,tar,err,fmt,Println,本地,go,docker
From: https://www.cnblogs.com/guangdelw/p/17567988.html

相关文章

  • win10使用Docker Desktop启动mysql报错:Error response from daemon: Ports are not av
    问题描述今天上班用wind10电脑启动DockerDesktop使用MySQL,突然间报了一个错,错误如下:Errorresponsefromdaemon:Portsarenotavailable:exposingportTCP0.0.0.0:3306->0.0.0.0:0:listentcp0.0.0.0:3306:bind:Anattemptwasmadetoaccessasocketinaway......
  • IntelliJ Docker环境构建
    介绍,以 Python为例  自从我购买了一台新的Macbook之后,我不得不重新创建Python开发环境,但是如果我直接在本地安装Python,则会不小心在全球安装该软件包,或者即使我使用venv,也要重新创建该环境。就像我想要的时候麻烦一样,所以我决定使用Docker来构建它。在IntelliJ上安装插件......
  • Docker CLI docker container prune 常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍DockerCLI中......
  • 大白话讲讲 Go 语言的 sync.Map(一)
    阅读本文大约需要4.25分钟。程序是枯燥乏味的。在讲sync.Map之前,我们先说说什么是map(映射)。我们每个人都有身份证号码,如果我需要从身份证号码查到对应的姓名,用map存储是非常合适的。map[000...001]=张三map[000...002]=李四...map[999...993]=钱五身份证号......
  • Docker大会的新福利:LinuxKit 和 Moby 开源项目
    在一年一度的DockerCon大会上,来自全球各地的5000名参与者,济济一堂,于奥斯丁会议中心,共同见证Docker的发展,探讨容器技术的落地。 Docker创办人暨技术长SolomonHykes认为,今年容器将成为主流,将散布伺服器、资料中心、云端、桌面、IoT与行动等运算装置,或金融、医疗保键......
  • Docker大会的新福利:LinuxKit 和 Moby 开源项目
    在一年一度的DockerCon大会上,来自全球各地的5000名参与者,济济一堂,于奥斯丁会议中心,共同见证Docker的发展,探讨容器技术的落地。 Docker创办人暨技术长SolomonHykes认为,今年容器将成为主流,将散布伺服器、资料中心、云端、桌面、IoT与行动等运算装置,或金融、医疗保键......
  • Docker大会的新福利:LinuxKit 和 Moby 开源项目
    在一年一度的DockerCon大会上,来自全球各地的5000名参与者,济济一堂,于奥斯丁会议中心,共同见证Docker的发展,探讨容器技术的落地。 Docker创办人暨技术长SolomonHykes认为,今年容器将成为主流,将散布伺服器、资料中心、云端、桌面、IoT与行动等运算装置,或金融、医疗保键......
  • docker+jacoco构建接口测试覆盖率
    代码中需要更改的内容Dockerfile1.在文件中引入jacocoagent.jar,引入后需检查是否引入成功ADD./jacocoagent.jar/jacocoagent.jar2.打开jacocoagent监控端口,不能与其他jacocoagent端口重复,此端口也是docker容器启动的必填项EXPOSE99263.加入jacocoagent启动参数,端口号......
  • Google 最高级别工程师的教育梦
    阅读文本大概需要2.8分钟。之前有读者问我,说我是不是Udacity的人,怎么老在底部放Udacity的Banner,这让我无言以对,我当然不是Udacity的人,Udacity是我的赞助商,正是这些赞助商爸爸们,才能让我有动力继续分享下去,所以我很感激他们。可能有人并不了解Udacity,其实Udacity的创立......
  • 你知道 Google X 神秘实验室创始人的故事么?
    阅读文本大概需要2.8分钟。之前有读者问我,说我是不是Udacity的人,怎么老在底部放Udacity的Banner,这让我无言以对,我当然不是Udacity的人,Udacity是我的赞助商,正是这些赞助商爸爸们,才能让我有动力继续分享下去,所以我很感激他们。可能有人并不了解Udacity,其实Udacity的创立......