【开发笔记】在Python中调用Docker,并运行SDK任务

news2024/11/24 1:14:25

目录

  • 1 背景
  • 2 环境准备
  • 3 实现流程
    • 3.1 连接远程Docker
    • 3.1 创建容器
    • 3.2 解压SDK
    • 3.3 挂载容器卷
    • 3.4 运行任务
    • 3.5 判断任务状态
    • 3.6 容器的停止与销毁
  • 4 可能遇到的问题

1 背景

  • 使用Python,在远程Docker中创建一个容器,并在该容器中运行SDK任务

2 环境准备

  • Python 3.10.4
  • Docker 24.0.5

3 实现流程

3.1 连接远程Docker

  • 使用docker.DockerClient进行连接
client = docker.DockerClient(base_url=f"tcp://{DOCKER_IP}:{DOCKER_PORT}", timeout=5)
  • 测试是否连接成功
# 输出Docker版本信息
docker_version = json.dumps(client.version(), indent=1)
print(docker_version)

# 输出容器信息
get_container_id_list = client.containers.list()
container_id_list = []
for ids in get_container_id_list:
    container_id_list= container_id_list + ids.image.tags
    print(container_id_list)
  • 若均能正常输出,则说明连接成功

3.1 创建容器

  • 使用DockerClient获取远程docker
client = docker.DockerClient(base_url=f"tcp://{DOCKER_IP}:{DOCKER_PORT}", timeout=5)

3.2 解压SDK

注意:此步骤最好在容器run之前执行,否则容器卷目录的所有者可能为root,导致SDK的上传出现权限问题

  • 使用paramikoscp工具将本地的SDK上传至服务器的对应目录
import paramiko
from scp import SCPClient

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(DOCKER_IP, 22, DOCKER_USERNAME, DOCKER_PASSWORD)

with SCPClient(ssh.get_transport()) as scp:
    # 将本地的文件拷贝到远程主机中
    scp.put(f'{SDK_PATH}/{sdk_id}', DOCKER_SDK_PATH, recursive=True)

3.3 挂载容器卷

  • 使用run命令启动容器,在volumes字段中挂在容器卷
container = client.containers.run(name=container_name,
                                      image=image,
                                      ports={f"{inner_port}/tcp": outer_port},
                                      volumes={f"{DOCKER_SDK_PATH}/{sdk_id}": {'bind': f"/app/{sdk_id}", 'mode': "rw"}},
                                      mem_limit='4g',
                                      runtime="nvidia",
                                      device_requests=[docker.types.DeviceRequest(capabilities=[['gpu']])],
                                      working_dir=f"/app/{sdk_id}",
                                      detach=True,
                                      auto_remove=True,
                                      tty=True)

3.4 运行任务

  • 调用SDK中的run.sh脚本启动SDK,注意增加执行权限
command = 'bash -c "chmod +x ./run.sh && ./run.sh"'
container.exec_run(command, detach=True)

3.5 判断任务状态

  • 若启动的SDK含有server监听端,可使用如下方法进行状态判断
def ready_task(timeout, outer_port, interface):
    start = time.time()
    while (time.time() - start) < timeout:
        try:
            requests.post(url=f'http://{DOCKER_IP}:{outer_port}/{interface}')
            return True
        except requests.exceptions.ConnectionError:
            time.sleep(0.1)
    else:
        return False
  • 若server启动成功,则返回True,若超时,则返回False

3.6 容器的停止与销毁

  • 任务执行完成后,可执行停止或销毁操作
def clean_task(test_id, sdk_id):
    client = docker.DockerClient(base_url=f"tcp://{DOCKER_IP}:{DOCKER_PORT}", timeout=5)
    try:
        client.containers.get(container_name).stop()
        client.containers.get(container_name).remove(force=True)
    except (NotFound, APIError):
        pass
  • 由于出现错误只可能是因为容器已经被停止或销毁,因此出现错误直接忽略即可

4 可能遇到的问题

  1. clinet连接报错:Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
  • 修改远程服务器内的docker.service内容
  • 将黄色框内的第一行修改为第二行,保存退出
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
  • 执行下面两行命令,重启docker
systemctl daemon-reload
systemctl restart docker
  • 查看docker重启状态
ps -ef | grep docker
  • 得到以下结果说明重启完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/882964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day10 11-牛客67道剑指offer-JZ37 、54、41、59、12、13、14、82、9、22

文章目录 1. JZ37 序列化二叉树2. JZ54 二叉搜索树的第k个节点3. JZ41 数据流中的中位数数组堆 4. JZ59 滑动窗口的最大值5. JZ12 矩阵中的路径6. JZ13 机器人的运动范围7. JZ14 剪绳子乘方dp 8. JZ82 二叉树中和为某一值的路径(一)9. JZ9 用两个栈实现队列10. JZ22 链表中倒数…

redis-数据类型及样例

一.string 类型数据的基本操作 1.添加/修改数据 set key value2.获取数据 get key3.删除数据 del key4.添加/修改多个数据 mset key1 value1 key2 value25.获取多个数据 mget key1 key2二.list类型的基本操作 数据存储需求&#xff1a;存储多个数据&#xff0c;并对数据…

2023,家用美容仪的“春天”来了吗?

【潮汐商业评论/原创】 编辑部的Jessica又买了一台水牙线&#xff0c;用她的话说&#xff1a;“能让自己更完美为什么不去试试呢&#xff1f;” 事实上&#xff0c;像这样的个护产品&#xff0c;Jessica不止一两个&#xff0c;从腰颈按摩仪到护肤导入仪、从全脸射频仪再到全身…

数的范围(二分模板)

大家好 我是寸铁 希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注 不清楚蓝桥杯考什么的点点下方&#x1f447; 考点秘籍 想背纯享模版的伙伴们点点下方&#x1f447; 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不…

lab2 system calls

目录 PreRead任务列表4.3 Code: Calling system calls4.4 Code: System call arguments System call tracing测试任务hints思路先看用户的trace函数trace系统调用到底是怎么作用的呢&#xff1f; 重新捋一遍系统调用的过程 Sysinfo任务hints思路 PreRead 任务列表 xv6课本 第二…

《人工智能大模型体验报告2.0》发布

ChatGPT 崛起引发新一轮生成式AI热潮&#xff0c;国内科技企业纷纷布局。据不完全统计&#xff0c;截至目前&#xff0c;国内大模型数量已达上百个。在这些大模型中&#xff0c;谁的表现最好&#xff0c;智能性最高&#xff0c;用户体验最强&#xff1f;8月12日&#xff0c;新华…

【华为认证数通高级证书实验-分享篇2】

实验拓扑 注&#xff1a;代码块为各交换机路由器中的配置命令 配置拓扑文件 实验要求 实现全网通 实验配置 SW3 [SW3]v b 10 20 [SW3]int e0/0/1 [SW3-Ethernet0/0/1]po link-t a [SW3-Ethernet0/0/1]po de v 10 [SW3-Ethernet0/0/1]int e0/0/2 [SW3-Ethernet0/0/2]po li…

【云计算原理及实战】初识云计算

该学习笔记取自《云计算原理及实战》一书&#xff0c;关于具体描述可以查阅原本书籍。 云计算被视为“革命性的计算模型”&#xff0c;因为它通过互联网自由流通使超级计算能力成为可能。 2006年8月&#xff0c;在圣何塞举办的SES&#xff08;捜索引擎战略&#xff09;大会上&a…

热电联产在综合能源系统中的选址定容研究(matlab代码)

目录 1 主要内容 目标函数 程序模型 2 部分代码 3 程序结果 1 主要内容 该程序参考《热电联产在区域综合能源系统中的定容选址研究》&#xff0c;主要针对电热综合能源系统进行优化&#xff0c;确定热电联产机组的位置和容量&#xff0c;程序以33节点电网和17节点热网为例…

Windows11 wsl2安装Ubuntu-20.04

Ubuntu系统开机报错(无法开机启动) Linux启动报错或无法启动的解决方法 Windows11 64bit系统 1.Windows11系统上&#xff0c;启用虚拟机平台 2.Windows11系统上&#xff0c;先启用"适用于Linux的Windows子系统"&#xff0c;然后在Windows11上安装Ubuntu-20.04系统 3…

软考:中级软件设计师:数据库模式、ER模型

软考&#xff1a;中级软件设计师:数据库模式、ER模型 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准…

杨氏矩阵!!!!

杨氏矩阵&#x1f438; &#x1f4d5;题目要求&#xff1a; 杨氏矩阵 题目内容&#x1f4da;&#xff1a; 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 &#x1f9e0;题…

Linux编程——进程间通信(信号灯集、消息队列)

目录 一、信号灯集1.1 概念1.2 信号灯集创建步骤⭐⭐⭐1.3 信号灯集对应函数 二、消息队列 一、信号灯集 1.1 概念 信号灯(semaphore)&#xff0c;也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制&#xff1b;System V的信号灯是一个或者多个信号灯的一个…

三星电子首席技术官:BSPDN技术开发计划曝光,背部供电技术创新

在ETNews的报道之后&#xff0c;三星电子的代工部门首席技术官Jung Ki-tae Jung透露了该公司在BSPDN技术开发方面的计划。 BSPDN技术是一项创新技术&#xff0c;旨在更好地利用半导体晶圆背面空间的潜力。虽然该技术尚未在全球范围内实施&#xff0c;但三星电子成为首家公开披…

ApiPost设置全局令牌

为了避免请求接口每次都要请求登录&#xff0c;获取令牌鉴权&#xff0c;我们可以设置全局令牌&#xff08;token&#xff09;&#xff0c;避免处处单独使用令牌&#xff0c;造成环境混乱&#xff0c;使用如下&#xff1a; 接口设置 我们先配置好请求接口和请求参数&#xff0…

QTreeWidget基本属性操作

文章目录 一、背景设置1、添加背景颜色之前与之后的对比1.2背景设置的两种方式 2、边框设置2.1、演示以上参数的实际效果2.1.1、无边框、虚线、实线边框演示2.1.2、边框的3D效果 一、背景设置 1、添加背景颜色之前与之后的对比 1.2背景设置的两种方式 通过QT设计界面中的改变…

基于eBPF技术构建一种应用层网络管控解决方案

引言 随着网络应用的不断发展&#xff0c;在linux系统中对应用层网络管控的需求也日益增加&#xff0c;而传统的iptables、firewalld等工具难以针对应用层进行网络管控。因此需要一种创新的解决方案来提升网络应用的可管理性。 本文将探讨如何使用eBPF技术构建一种应用层网络…

观察者模式 Observer Pattern 《游戏编程模式》学习笔记

定义 观察者模式定义了对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 这是定义&#xff0c;看不懂就看不懂吧&#xff0c;我接下来举个例子慢慢说 为什么我们需要观察者模式 我们看一个很简…

软件确认测试报告的作用,第三方测试机构进行确认测试的好处

近年来&#xff0c;随着软件产品的不断发展和普及&#xff0c;软件确认测试作为一项重要的质量保障手段也越来越受到关注&#xff0c;主要是为了检测软件产品是否符合需求规格和预期功能&#xff0c;以及是否存在缺陷和问题。对于软件产品开发商来说&#xff0c;进行确认测试是…

未济卦-物不可穷

前言&#xff1a;学无止境&#xff0c;人生没有终点&#xff0c;虽说是六十四卦的最后一卦&#xff0c;仍是“未济”&#xff0c;今天学习未济卦的卦辞和爻辞。 卦辞 亨&#xff1b;小狐汔济&#xff0c;濡其尾&#xff0c;无攸利。 序卦&#xff1a;无不可穷也&#xff0c;故…