Golang使用docker sdk管理docker

server/2024/9/20 3:57:20/ 标签: golang, docker, 开发语言, 后端, 容器, 经验分享

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

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。


http://www.ppmy.cn/server/88892.html

相关文章

微服务安全——OAuth2.1详解、授权码模式、SpringAuthorizationServer实战、SSO单点登录、Gateway整合OAuth2

文章目录 Spring Authorization Server介绍OAuth2.0协议介绍角色OAuth2.0协议的运行流程应用场景授权模式详解客户端模式密码模式授权码模式简化模式token刷新模式 OAuth 2.1 协议介绍授权码模式PKCE扩展设备授权码模式拓展授权模式 OpenID Connect 1.0协议Spring Authorizatio…

java对接soap工具类-callSonyInterfaceQuery

新写的工具类,其中有对接soap的工具类 import com.shutong.common.exception.ServiceException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.Cont…

基于jeecgboot-vue3的Flowable流程仿钉钉流程设计器-抄送服务处理

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、因为仿钉钉设计器里抄送人是一个服务任务&#xff0c;所以要根据这个服务任务进行处理 2、前端就是一个抄送&#xff0c;选择人 3、这里用了jeecg的选择人组件 <el-form-item prop…

LongAlign:大模型长文本处理能力提升之道

人工智能咨询培训老师叶梓 转载标明出处 大模型&#xff08;LLMs&#xff09;在处理长文本时&#xff0c;需要在输入序列上进行指令微调&#xff08;instruction finetuning&#xff09;&#xff0c;以确保它们能够有效地处理长文本。现有的方法主要集中在上下文扩展&#xff0…

Qt第十三章 目录和文件操作

目录和文件操作 文章目录 目录和文件操作设备I/O简介I/O设备的类型基本文件读写QFileQTemporaryFile 流操作QTextStreamQDataStream QFileInfoQDirQFileSystemWatcherQStandardPathsQSettings 设备I/O 简介 I/O设备的类型 基本文件读写 QFile QFile file("C:/Users/PV…

C++ | Leetcode C++题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; class Solution { public:int firstBadVersion(int n) {int left 1, right n;while (left < right) { // 循环直至区间左右端点相同int mid left (right - left) / 2; // 防止计算时溢出if (isBadVersion(mid)) {right mid; // 答案…

力扣984.不含AAA或BBB的字符串

力扣984.不含AAA或BBB的字符串 贪心 如下 class Solution {public:string strWithout3a3b(int a, int b) {string res;while(a > b && b > 0){res "aab";a--,a--;b--;}while(b > a && a > 0){res "bba";b--,b--;a--;}whi…

C#实现数据采集系统-modbustcp数据通知

实现数据推送 在ModbusTcp模块中已经能够获取到正确的plc值,接下来做的就是如何让外部调用的程序获取到相关的数据,主要就是两种方法:通过对象属性进行共享;通过事件进行推送 方法一:通过类属性共享 在RegisterPoint类中增加public object Value { get; set; }value属性…

算法之递归算法

递归是非常常见的一种算法&#xff0c; 也比较难以理解&#xff0c;简而言之&#xff0c;递归就是写了一个方法&#xff0c;方法中还调用了该方法&#xff0c;相当于自己调用自己&#xff0c;如果书写不当&#xff0c;就会有堆栈溢出的风险&#xff0c;无法跳出。 所以我们编写…

【CTFWP】ctfshow-web36

文章目录 题目介绍&#xff1a;题目分析&#xff1a;payload&#xff1a;payload解释&#xff1a;flag 题目介绍&#xff1a; <?php/* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2020-09-04 00:12:34 # Last Modified by: h1xa # Last Modified time: 2020-09-…

Power App学习笔记以及基础项目管理demo

Power App学习笔记以及基础项目管理demo 最近学习了一点Power App&#xff0c;感觉挺有意思。配置式组件开发。浅浅记录一下自己实现的项目管理系统&#xff08;即Excel数据的增删改查&#xff09;关于函数的一点皮毛认识。 效果图 筛选数据 编辑 详情 数据源 PowerApp 网…

河北省高校大数据人工智能实验室案例分享

随着大数据和人工智能技术的快速发展&#xff0c;教育领域也迎来了前所未有的变革机遇。泰迪智能科技作为一家专注于大数据与人工智能领域的高新技术企业&#xff0c;一直致力于将前沿技术引入教育行业&#xff0c;助力高校培养更多具有创新能力和实战经验的复合型人才。本次案…

PHP Switch 语句

PHP 中的 switch 语句是一种多路分支语句&#xff0c;它允许一个变量的值对多个代码块进行选择执行。这通常比使用多个 if...elseif...else 语句更清晰、更易于维护。下面将详细介绍 PHP 中 switch 语句的使用方法。 基本语法 switch (n) {case label1:// 如果 n label1&…

<Python><paddle>基于python使用百度paddleocr实现车牌识别

前言 paddleocr是百度飞桨的一个文字识别库&#xff0c;准确度非常高&#xff0c;基于其文字识别的基础&#xff0c;将其用于车牌识别。这个识别的准确度是相当高的。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;python 库&#…

oracle使用backup as copy方式迁移数据文件

oracle使用backup as copy方式迁移数据文件 1 基础环境 --确认数据文件路径 set line 200 col name for a75 select file#,name from v$datafileFILE# NAME ---------- ---------------------------------------------------------------------------1 /u01/app/oracle/orada…

一些和颜色相关网站

1.中国传统色 2.网页颜色选择器 3.渐变色网站 4.多风格色卡生成 5.波浪生成 6.半透明磨砂框 7.色卡组合

MAC配置环境变量

MAC配置环境变量的地方 1./ext/profile(建议不修改这个文件) 全局&#xff08;共有&#xff09;配置一般不管那个用户&#xff0c;登陆时都会读取该文件。 2./ext.bashrc(一般在这个文件中添加系统级环境变量) 全局&#xff08;公有&#xff09;配置&#xff0c;bash shel…

Leetcode 721.账户合并(hash+dfs)☆

思路&#xff1a; 最核心的地方在于如何合并&#xff1f;这里是通过具有相同的email进行账户的合并&#xff0c;这个相同的email类似于图中的共同节点将两个账户连接起来&#xff0c;所以将原来 账户名 -> 邮件1 邮件2.。。变成hash 邮件1 ->账户id1&#xff0c;账户id2…

WPF启动失败报System.Windows.Automation.Peers.AutomationPeer.Initialize()错误解决

问题描述 win10系统上WPF程序启动后就崩溃&#xff0c;通过查看崩溃日志如下&#xff1a; 应用程序: xxx.exe Framework 版本: v4.0.30319 说明: 由于未经处理的异常&#xff0c;进程终止。 异常信息: System.TypeLoadException 在 System.Windows.Automation.Peers.Automatio…