go通过docker sdk操作镜像

发布时间 2023-07-20 01:33:15作者: 厚礼蝎

获取所有镜像

package main

import (
	"context"
	"fmt"

	"github.com/docker/docker/api/types"
	"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(),
	)
	if err != nil {
		fmt.Println("创建容器失败:", err)
		return
	}
	images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
	if err != nil {
		fmt.Println("获取镜像失败:", err)
		return
	}
	fmt.Println("Docker Images:")
	for _, image := range images {
		fmt.Printf("ID: %s\n", image.ID)
		fmt.Printf("RepoTags: %v\n", image.RepoTags)
		fmt.Printf("Size: %d\n", image.Size)
		fmt.Println("------------------------")
	}
}

删除镜像

package main

import (
	"context"
	"fmt"

	"github.com/docker/docker/api/types"
	"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(),
	)
	if err != nil {
		fmt.Println("创建容器失败:", err)
		return
	}
	imageName := "a:v5" // 要删除的镜像名称和标签或者镜像ID
	_, err = cli.ImageRemove(context.Background(), imageName, types.ImageRemoveOptions{
		Force:         true, // 如果镜像有依赖也会被强制删除
		PruneChildren: true, // 如果镜像有子依赖也会被删除
	})
	if err != nil {
		fmt.Println("删除镜像失败:", err)
		return
	}

	fmt.Println("删除成功!")
}

拉取镜像

package main

import (
	"context"
	"fmt"
	"io"
	"os"

	"github.com/docker/docker/api/types"
	"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(),
	)
	if err != nil {
		fmt.Println("创建容器失败:", err)
		return
	}

	imageName := "busybox:latest" // 要拉取的镜像名称和标签
	ctx := context.Background()

	// 指定拉取的选项
	options := types.ImagePullOptions{}

	// 发起拉取镜像的请求
	resp, err := cli.ImagePull(ctx, imageName, options)
	if err != nil {
		fmt.Println("拉取镜像失败:", err)
		return
	}
	defer resp.Close()

	// 将镜像拉取过程输出到标准输出
	_, err = io.Copy(os.Stdout, resp)
	if err != nil {
		fmt.Println("输出异常:", err)
		return
	}
	fmt.Println("成功拉去镜像!")
}

导出镜像

package main

import (
	"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(),
	)
	if err != nil {
		fmt.Println("创建容器失败:", err)
		return
	}

	outputDir := "."              // 导出镜像的输出目录

	ctx := context.Background()

	// 发起导出镜像的请求
	resp, err := cli.ImageSave(ctx, []string{"busybox:latest", "httpd:2.4", "a:v4"}) // 要导出的镜像名称和标签 可以打包多个镜像
	if err != nil {
		fmt.Println("镜像导出请求失败:", err)
		return
	}
	defer resp.Close()

	// 创建目标输出文件
	outputFilePath := filepath.Join(outputDir, "save-images.tar")
	outputFile, err := os.Create(outputFilePath)
	if err != nil {
		fmt.Println("创建镜像输出到目标文件出错:", err)
		return
	}
	defer outputFile.Close()

	// 将镜像内容写入输出文件
	_, err = io.Copy(outputFile, resp)
	if err != nil {
		fmt.Println("镜像导出请求失败:", err)
		return
	}
	fmt.Println("镜像导出成功")
}

导入镜像

package main

import (
	"context"
	"fmt"
	"io"
	"os"

	"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
	}

	inputFilePath := "busybox-latest.tar" // 要导入的镜像文件路径
	ctx := context.Background()

	// 打开要导入的镜像文件
	inputFile, err := os.Open(inputFilePath)
	if err != nil {
		fmt.Println("镜像文件打开失败:", err)
		return
	}
	defer inputFile.Close()

	// 发起导入镜像的请求
	resp, err := cli.ImageLoad(ctx, inputFile, true)
	if err != nil {
		fmt.Println("镜像导入失败:", err)
		return
	}
	defer resp.Body.Close()

	// 读取并输出导入过程的结果
	_, err = io.Copy(os.Stdout, resp.Body)
	if err != nil {
		fmt.Println("输出结果失败:", err)
		return
	}
	fmt.Println("镜像导入成功!")
}