包括列出容器、创建容器、删除容器、进入容器、构建镜像等操作。
Gopackage dockertool import ( "context" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/image" "github.com/docker/docker/client" "io" "os" ) // 列出所有容器 func ListContainers() ([]types.Container, error) { apiClient, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { return nil, err } defer apiClient.Close() containers, err := apiClient.ContainerList(context.Background(), container.ListOptions{All: true}) if err != nil { return nil, err } // TODO : for debug for _, ctr := range containers { fmt.Printf("%s %s %q (status: %s)\n", ctr.ID, ctr.Image, ctr.Names, ctr.Status) } return containers, nil } // 删除所有镜像和容器 func DeleteAllContainersAndImages() error { apiClient, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { return err } defer apiClient.Close() //停止、删除所有容器 containers, err := apiClient.ContainerList(context.Background(), container.ListOptions{All: true}) if err != nil { return err } for _, ctr := range containers { err = apiClient.ContainerStop(context.Background(), ctr.ID, container.StopOptions{}) if err != nil { return err } err = apiClient.ContainerRemove(context.Background(), ctr.ID, container.RemoveOptions{}) if err != nil { return err } } fmt.Println("All containers deleted") //删除所有镜像 images, err := apiClient.ImageList(context.Background(), image.ListOptions{}) if err != nil { return err } for _, im := range images { _, err := apiClient.ImageRemove(context.Background(), im.ID, image.RemoveOptions{}) if err != nil { return err } } fmt.Println("All images deleted") return nil } // 创建容器并运行 func BuildContainer(ContainerName string, ImageName string) error { cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { return err } defer cli.Close() config := &container.Config{ Image: ImageName, } // 创建容器 resp, err := cli.ContainerCreate(context.Background(), config, nil, nil, nil, ContainerName) if err != nil { panic(err) } fmt.Printf("Container created with ID: %s\n", resp.ID) // 启动容器 if err := cli.ContainerStart(context.Background(), resp.ID, container.StartOptions{}); err != nil { panic(err) } fmt.Println("Container started") return nil } // 本地创建镜像 func BuildImage(ImageName string, TarPath string, DockerfilePath string) error { cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { return err } defer cli.Close() // 设置构建上下文(这里使用文件路径作为示例) // 注意:这个路径应该包含 Dockerfile 和所有需要的构建文件 buildContext, err := os.Open(TarPath) if err != nil { return err } defer buildContext.Close() // 设置构建选项 options := types.ImageBuildOptions{ Tags: []string{ImageName}, Dockerfile: DockerfilePath, SuppressOutput: false, // 设置为 false 以获取构建日志 NoCache: false, // 不使用缓存 Remove: true, // 构建完成后删除中间容器 ForceRemove: true, // 强制删除中间容器 PullParent: true, // 如果基础镜像不存在,则尝试拉取 } // 触发构建 response, err := cli.ImageBuild(context.Background(), buildContext, options) if err != nil { return err } fmt.Println("Built image " + ImageName) defer response.Body.Close() return nil } // 进入容器并执行命令 func ContainerProcess(ContainerID string, ProcessID string) error { cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { return err } defer cli.Close() execConfig := types.ExecConfig{ Cmd: []string{"ps -f -p" + ProcessID}, // 使用bash执行ps命令,取决于容器内环境 AttachStdin: false, AttachStdout: true, AttachStderr: true, Tty: false, } // 创建一个exec实例 resp, err := cli.ContainerExecCreate(context.Background(), ContainerID, execConfig) if err != nil { return err } // 连接到exec实例的输出 readCloser, err := cli.ContainerExecAttach(context.Background(), resp.ID, types.ExecStartCheck{}) if err != nil { return err } defer readCloser.Close() _, err = io.Copy(os.Stdout, readCloser.Reader) if err != nil { return err } return nil }在linux环境中运行:
如果你在windows环境编程,docker在linux且是amd64架构,在代码目录里打开终端,输入
$env:GOOS="linux"
$env:GOARCH="amd64"
go build -o output
这样生成编译后的结果output,再把它放到linux环境中,并设置文件权限chmod 777 output,最后执行./output。
Golang使用docker sdk管理docker
装B且挨揍の2024-07-26 11:32
相关推荐
OpenVINO 中文社区几秒前
OpenVINO™ 2026.2: 更多模型,更快 GPU,更强智能体五月君_几秒前
放弃 Python,Kimi 用 TS + Node.js 重写了一个 Kimi Code还是鼠鼠几秒前
AI掘金头条新闻系统 (Toutiao News)-获取用户信息BingoGo3 分钟前
免费可商用 PHP 管理后台 CatchAdmin V5.3.1 发布 后台打包直降 5s 内tellmewhoisi4 分钟前
Docker Compose最巧妙的设计之一——内置的服务发现机制AI服务老曹10 分钟前
解耦异构算力:基于 Docker 与 GB28181/RTSP 的边缘计算 AI 视频管理平台架构设计(支持源码交付)captain_AIouo12 分钟前
深耕海外市场,autoAGC攻破品牌跨境内容运营难题JaguarJack16 分钟前
免费可商用 PHP 管理后台 CatchAdmin V5.3.1 发布 后台打包直降 5s 内Cloud_Shy61816 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔雨辰AI21 分钟前
MySQL 迁移至达梦 DM9 完整改造指南|99% SQL 零改动