当前位置: 首页> 汽车> 行情 > Golang使用docker sdk管理docker

Golang使用docker sdk管理docker

时间:2025/7/11 14:33:25来源:https://blog.csdn.net/weixin_61067952/article/details/140615346 浏览次数: 0次

 包括列出容器、创建容器、删除容器、进入容器、构建镜像等操作。

package dockertoolimport ("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 debugfor _, 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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: