当前位置: 首页 > article >正文

dockerSDK-Go语言实现

前情提要

本文基于开发一个在线代码运行平台的项目需求上,所以需要挂载目录以达到获得执行文件的目的。

步骤1

首先在docker-compose 文件中,当前容器一定要跟宿主机的套接字进行挂载

version: '3.8'  
  
services:  
  code-runner-api:  
    build:  
      context: .  
      dockerfile: builds/api/Dockerfile  
    volumes:  
      - /var/run/docker.sock:/var/run/docker.sock  
    environment:  
      - APP_ENV=production  
      - DOCKER_HOST=unix:///var/run/docker.sock  
    ports:  
      - ""  

步骤二

创建docker客户端

type dockerContainerClient struct {  
    ctx context.Context  
    cli *client.Client  
}  
  
// NewDockerClient 
func NewDockerClient(ctx context.Context) (*dockerContainerClient, error) {  
    cli, err := client.NewClientWithOpts(  
       client.WithHost("unix:///var/run/docker.sock"),  
       client.WithAPIVersionNegotiation(), // 自动协商API版本  
    )  
    if err != nil {  
       log.Println("domain.client.entity.NewDockerClient() NewClientWithOpts err=", err)  
       return nil, fmt.Errorf("创建Docker客户端失败: %v", err)  
    }  
    return &dockerContainerClient{ctx: ctx, cli: cli}, nil  
}  
  

创建容器示例

// CreateContainer 创建指定容器  
func (client *dockerContainerClient) createContainer(image string, language string) (container.CreateResponse, error) {  
    config := &container.Config{  
       Image:      image,  
       User:       "root",  
       WorkingDir: "/app",  
       Cmd:        []string{"sleep", "infinity"}, // 修改启动命令为 sleep 无限循环  
       Env: []string{  
          "GO111MODULE=on",  
          "GOPROXY=https://goproxy.cn,direct",  
       },  
    }  
  
    hostConfig := &container.HostConfig{  
       ReadonlyRootfs: false,  
       CapDrop:        []string{"ALL"},  
       NetworkMode:    "none", // 关闭容器网络连接  
       Resources: container.Resources{  
          Memory:     512 * 1024 * 1024,  
          MemorySwap: 512 * 1024 * 1024,  
          CPUQuota:   100000,  
          CPUPeriod:  100000,  
          CPUCount:   1,  
       },  
       Binds: []string{fmt.Sprintf("/tmp/%s:/app", language)}, // 挂载到容器的/app目录  
    }  
  
    fmt.Printf("创建容器配置:\n")  
    fmt.Printf("镜像:%s\n", image)  
    fmt.Printf("工作目录:%s\n", config.WorkingDir)  
    fmt.Printf("挂载路径:%s\n", hostConfig.Binds[0])  
  
    resp, err := client.cli.ContainerCreate(  
       client.ctx,  
       config,  
       hostConfig,  
       nil,  
       nil,  
       "",  
    )  
    if err != nil {  
       log.Println("domain.client.entity.createContainer() ContainerCreate err=", err)  
       return container.CreateResponse{}, fmt.Errorf("容器创建失败: %v", err)  
    }  
    return resp, nil  
}

注意

1.如果想营造安全的沙箱环境一定要记得关闭容器的网络

2.注意挂载的路径,最好在代码中打印检查一下传入的参数


http://www.kler.cn/a/595611.html

相关文章:

  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例7,TableView15_07带边框和斑马纹的导出表格示例
  • 【数据库备份】docker中数据库备份脚本——MySql备份脚本
  • C++ 异常 【无敌详细版】
  • 汇川EASY系列之以太网通讯(MODBUS_TCP做主站)
  • 爱普生晶振FC2012AA汽车ADAS主控制系统的理想选择
  • 对接马来西亚、印度、韩国、越南等全球金融数据示例
  • visual studion 2022如何使用PlaySound()
  • 扩展卡尔曼滤波
  • Java 大视界 -- Java 大数据在智能医疗远程会诊与专家协作中的技术支持(146)
  • 阅读《Vue.js设计与实现》 -- 03
  • hashMap部分相关知识
  • 未来办公与生活的新范式——智慧园区
  • 二分查找-在排序数组中查找元素的第一个和最后一个位置
  • 【鸿蒙开发】Hi3861学习笔记- 串口
  • Excel online开始支持Copilot高级数据分析:Python提供强大的数据见解
  • 【从零开始学习计算机科学与技术】系统工程概论(二)系统工程方法论
  • rust Send Sync 以及对象安全和对象不安全
  • 【Pandas】pandas Series plot.bar
  • 蓝桥每日打卡--打家劫舍4
  • 大数据学习(80)-数仓分层