Docker-py 的使用
Docker SDK for Python
A Python library for the Docker Engine API
具体文档这里,https://docker-py.readthedocs.io/en/stable/index.html
先说明一下,需求是通过python 调用docker daemon,做到启动一个人服务或者容器,去运行一个程序。
话不多说,先贴上使用容器部分的代码
import docker
cli = docker.from_env() # 使用本地的docker deamon
py_container = cli.containers.run( #运行一个容器
image='python:3',
command='python hello.py',
volumes={'/opt/':{'bind':'/opt','mode':'rw'}},
name='helloworld-dockerpy1',
working_dir='/opt',
detach=True,
stdout=True,
stderr=True,
user='root',
remove=False
)
def wait_container(): #判断容器退出后,提取log
if py_container in cli.containers.list(filters={'status':'exited'}):
with open('/tmp/py_log.txt', 'a') as f:
f.write(str(py_container.logs()))
else:
wait_container()
wait_container()
print(str(py_container.logs()))
py_container.remove()
下面是使用服务的部分代码
还没有解决判断service中容器状态的参数,还在学习APIClient这个调用本地docker daemon的方法。如有大神,请留言教导我。
import docker
cli = docker.from_env()
py_service = cli.services.create(
image='python:3',
name='py_service1',
command='python hello.py',
mounts={'/opt:/opt:rw'},
workdir='/opt',
user='root'
)
time.sleep(30)
logs = py_service.logs(stdout='True')
for l in logs:
len1 = len(l)
if len1 == 0:
print('null')
else:
print(len1)
print(str(l,encoding='utf-8'))
py_service.remove()
下面这段是从本地的docker日志存放目录中提取日志,相对于上一种,这种方法很大弊端在于使用service的使用,容器是运行在swarm中的,不一定就运行在本地的swarm节点上。这样就无法提取日志了。
import docker
import time
cli = docker.from_env()
py_service2 = cli.services.create(
image='python:3',
name='py_service2',
command='python hello.py',
mounts={'python_test:/opt:rw'},
workdir='/opt',
user='root'
)
time.sleep(10)
def service_log():
attempts = 100
while True:
if attempts == 0:
print('No service logs produced by endpoint')
return
logs = py_service2.logs(stdout='True')
try:
log_line = next(logs)
except StopIteration:
attempts -= 1
time.sleep(0,1)
continue
else:
break
def print_log():
i = 0
while i < 2:
i+=1
list = py_service2.tasks(filters={'desired-state':'shutdown','name':'py_service2'})
logs = py_service2.logs(stdout='True')
time.sleep(5)
container_id = list[0]['Status']['ContainerStatus']['ContainerID']
print(container_id)
container_log = '/var/lib/docker/containers/'+ container_id +'/'+container_id + '-json.log'
all_the_text = open(container_log).read()
print(all_the_text)
print_log()
py_service2.remove()
Docker-py 的使用的更多相关文章
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
- zabbix上监控docker
说明 第一种方案,借助docker的python版的api,然后通过自己封装自定义脚本来做,稍微麻烦点,但是可以达到个人自定义的效果. 第二种借助国外的一位大神已经封装好的模板来做,简单省事情,不过功 ...
- zabbix监控docker容器状态
前言:前段时间在部署zabbix,有个需求就是需要监控容器的状态 也就是cpu 内存 io的占用,于是就自己写了一个脚本,以及模板,在这里分享一下 嘿嘿 : ) 废话我也就不多说,直接开始 首选,za ...
- Docker(十一)-Docker commit创建镜像
创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 修改已有的镜像 查看已有的镜像: $ sudo docker images REPOSITO ...
- docker——三剑客之Docker swarm
Docker Swarm是Docker官方的三剑客项目之一,提供Docker容器集群服务,是Docker官方对容器云生态进行支持的核心方案.使用它,用户可以将多个Docker主机封装为单个大型的虚拟D ...
- 如果想从jenkins直接生成docker镜像,并推送到harbor中,最简单的脚本如何实现?
如果不考虑意外, 第一版最简单的构思如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import getopt, sys import subpro ...
- zabbix--高级篇-监控docker服务(一)
一,配置zabbix 客户端环境 rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix//x86_64/zabbix-release-.el7.noarc ...
- kolla-ansible源码分析
一.kolla-ansible 源码的目录结构 kolla-ansible是从kolla项目分离出来的一个可交付的项目,kolla-ansible负责部署容器化的openstack各个服务和基础设施组 ...
- 使用github中py12306抢票系得
首先需要安装最新的python:安装步骤见:https://www.cnblogs.com/weven/p/7252917.html 其次下载python源码: 链接:https://pan.baid ...
- 一篇文章了解_docker
(一)Docker介绍 2018年10月6日 星期六 15:04 什么就Docker? Docker是一个开源项目, 诞生于2013年初,最初是dotCloud公司内部的一个业余项目.它基于Googl ...
随机推荐
- C#用panel实现子窗体的切换
今天编程的时候,遇到一个问题:在同一个窗体区域加载两个不同的窗体,每次只显示一个子窗体并能够对这两个子窗体做切换. 对于这个问题用panel控件是非常简单的,只要每次清空panel控件上的子窗体,然后 ...
- 插件lombok的介绍安装
Lombok插件 介绍一个不错的Eclipse插件Lombok 该插件对Log4j简化的代码,因为不大,所以jar包也存在呢! Lombox是Eclipse的一个插件,用来自动生成Java代码,减少手 ...
- javascript第五章--函数表达式
① 递归 ② 闭包 ③ 模仿块级作用域 ④ 私有变量
- 基于BroadReceiver实现获取短信内容
我朋友拜托我做一个能实现向指定号码发短信获取动态密码的一个小app,中间用到了基于监听系统通知的BroadReceiver 来实现获取有新短信并且获取新短信的内容.下面就是这个小app的实现监听部分的 ...
- ArrayList迭代过程删除问题
一:首先看下几个ArrayList循环过程删除元素的方法(一下内容均基于jdk7): package list; import java.util.ArrayList; import java.uti ...
- LKD: Chapter 6 Kernel Data Structures
这一章我们研究四种主要的数据结构: linked lists, queues, maps, binary trees. Linked Lists:(<linux/list.h>) 在lin ...
- Hue 之 SparkSql interpreters的配置及使用
1.环境说明: HDP 2.4 V3 sandbox hue 4.0.0 2.hue 4.0.0 编译及安装 地址:https://github.com/cloudera/hue/releases/t ...
- A:分段函数-poj
A:分段函数 总时间限制: 1000ms 内存限制: 65536kB 描述 编写程序,计算下列分段函数y=f(x)的值. y=-x+2.5; 0 <= x < 5 y=2-1.5(x- ...
- 网页的居中显示,使用了margin、clear:both
很久没写过页面了,现在写起来也觉得捡起来还是挺快的. 当时遇到了这样的问题,我有一个大的div包涵了整个网站,有网页头部,中部还有底部.头部就是一个标题,中部就是几张图片跟文字排版,结果左右两边的图片 ...
- css中的float和position
1.float <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...