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

目录

  • 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.tagsprint(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 SCPClientssh = 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 Trueexcept 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.hqwc.cn/news/69334.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中使用隧道爬虫ip提升数据爬取效率

作为专业爬虫程序员&#xff0c;我们经常面临需要爬取大量数据的任务。然而&#xff0c;有些网站可能会对频繁的请求进行限制&#xff0c;这就需要我们使用隧道爬虫ip来绕过这些限制&#xff0c;提高数据爬取效率。本文将分享如何在Python中使用隧道爬虫ip实现API请求与响应的技…

Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL

导航&#xff1a; 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线MySQL高级篇设计模式面试题汇总源码_vincewm的博客-CSDN博客 目录 一、基本区别 1.1 基本特性 1.2 Oracle和MySQL如何做技术选型&#xff1f; 1.3 RDBM…

MQTT协议--技术文档--搭建mqtt服务器--《EMQX单体服务器部署》

产品概览 | EMQX 5.1 文档 什么是EMQX&#xff1f; EMQX 是一款开源 (opens new window)的大规模分布式 MQTT 消息服务器&#xff0c;功能丰富&#xff0c;专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条&#xff0c;单服务器的传输与处理…

读书笔记 |【项目思维与管理】➾ 顺势而动

读书笔记 |【项目思维与管理】➾ 顺势而动 一、企业步入“终结者时代”二、过去成功的经验也许是最可怕的三、做好非重复性的事四、适应客户是出发点五、向知识型企业转变六、速度是决胜条件 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; …

React 之 Suspense和lazy

一. Suspense 参考链接&#xff1a;https://react.docschina.org/reference/react/Suspense suspense&#xff1a;n. 焦虑、悬念 <Suspense> 允许你显示一个退路方案&#xff08;fallback&#xff09;直到它的所有子组件完成加载。 <Suspense fallback{<Loadin…

在Centos环境中搭建Nginx环境

一、Nginx概念简介 Nginx是一个轻量级的高性能HTTP反向代理服务器&#xff0c;同时它也是一个通用类型的代理服务器&#xff0c;支持绝大部分协议&#xff0c;如TCP、UDP、SMTP、HTTPS等。 Nginx与redis相同&#xff0c;都是基于多路复用模型构建出的产物&#xff0c;因此它与R…

【linux】2 软件管理器yum和编辑器vim

目录 1. linux软件包管理器yum 1.1 什么是软件包 1.2 关于rzsz 1.3 注意事项 1.4 查看软件包 1.5 如何安装、卸载软件 1.6 centos 7设置成国内yum源 2. linux开发工具-Linux编辑器-vim使用 2.1 vim的基本概念 2.2 vim的基本操作 2.3 vim正常模式命令集 2.4 vim末行…

Vue-8.集成(.editorconfig、.eslintrc.js、.prettierrc)

介绍 同时使用 .editorconfig、.prettierrc 和 .eslintrc.js 是很常见的做法&#xff0c;因为它们可以在不同层面上帮助确保代码的格式一致性和质量。这种组合可以在开发过程中提供全面的代码维护和质量保证。然而&#xff0c;这也可能增加一些复杂性&#xff0c;需要谨慎配置…

【算法题】螺旋矩阵II (求解n阶Z形矩阵)

一、问题的提出 n阶Z形矩阵的特点是按照之(Z)字形的方式排列元素。n阶Z形矩阵是指矩阵的大小为nn&#xff0c;其中n为正整数。 题目描述 一个 n 行 n 列的螺旋(Z形)矩阵如图1所示&#xff0c;观察并找出填数规律。 图1 7行7列和8行8列的螺旋(Z形)矩阵 现在给出矩阵大小 n&…

VUE+ElementUI的表单验证二选一必填项,并且满足条件后清除表单验证提示

上代码 <el-form-item label"出库单号" prop"ecode" ref"ecode" :rules"rules.ecode"><el-input v-model"queryParams.ecode" placeholder"出库单号和出库箱号至少填写一项" clearable style"width…

学习ts(二)数据类型(接口和对象类型、数组类型)

interface 重名会重合到一起 如果两个interface名称相同&#xff0c;会把两个合到一起 重复定义同一个需要类型相同 不能多或者减少属性 设置任意key 当定义接口返回数据时&#xff0c;我们不确定接口会返回多少&#xff0c;知道所需要的固定属性&#xff0c;其余属性可以…

基于JSP的毕业生就业信息管理系统实战-lw(源码)

系列文章目录 基于jspm在线教育资源管理系统-毕设 文章目录 系列文章目录前言一、主要技术jsp技术Mysql数据库SSM三大框架1.Spring的优势:2.Spring MVC的优势:3.Mybatis的优势: 二、系统设计三、功能截图总结 前言 当前&#xff0c;高校毕业生就业工作的重要性不可忽视&#x…