go通过docker sdk操作镜像
获取所有镜像
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("镜像导入成功!")
}
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/17567195.html