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 的使用的更多相关文章

  1. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

  2. zabbix上监控docker

    说明 第一种方案,借助docker的python版的api,然后通过自己封装自定义脚本来做,稍微麻烦点,但是可以达到个人自定义的效果. 第二种借助国外的一位大神已经封装好的模板来做,简单省事情,不过功 ...

  3. zabbix监控docker容器状态

    前言:前段时间在部署zabbix,有个需求就是需要监控容器的状态 也就是cpu 内存 io的占用,于是就自己写了一个脚本,以及模板,在这里分享一下 嘿嘿 : ) 废话我也就不多说,直接开始 首选,za ...

  4. Docker(十一)-Docker commit创建镜像

    创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 修改已有的镜像 查看已有的镜像: $ sudo docker images REPOSITO ...

  5. docker——三剑客之Docker swarm

    Docker Swarm是Docker官方的三剑客项目之一,提供Docker容器集群服务,是Docker官方对容器云生态进行支持的核心方案.使用它,用户可以将多个Docker主机封装为单个大型的虚拟D ...

  6. 如果想从jenkins直接生成docker镜像,并推送到harbor中,最简单的脚本如何实现?

    如果不考虑意外, 第一版最简单的构思如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import getopt, sys import subpro ...

  7. zabbix--高级篇-监控docker服务(一)

    一,配置zabbix 客户端环境 rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix//x86_64/zabbix-release-.el7.noarc ...

  8. kolla-ansible源码分析

    一.kolla-ansible 源码的目录结构 kolla-ansible是从kolla项目分离出来的一个可交付的项目,kolla-ansible负责部署容器化的openstack各个服务和基础设施组 ...

  9. 使用github中py12306抢票系得

    首先需要安装最新的python:安装步骤见:https://www.cnblogs.com/weven/p/7252917.html 其次下载python源码: 链接:https://pan.baid ...

  10. 一篇文章了解_docker

    (一)Docker介绍 2018年10月6日 星期六 15:04 什么就Docker? Docker是一个开源项目, 诞生于2013年初,最初是dotCloud公司内部的一个业余项目.它基于Googl ...

随机推荐

  1. Jxl创建Excel文件和解析Excel文件

    import java.io.File; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; im ...

  2. [转载] 谷歌技术"三宝"之MapReduce

    转载自http://blog.csdn.net/opennaive/article/details/7514146 江湖传说永流传:谷歌技术有"三宝",GFS.MapReduce和 ...

  3. 手工搭建基于ABP的框架(3) - 登录,权限控制与日志

    为了防止不提供原网址的转载,特在这里加上原文链接: http://www.cnblogs.com/skabyy/p/7695258.html 本篇将实现登录.权限控制.日志配置与审计日志的功能.首先我 ...

  4. shell脚本 expect 实现自动登陆

    vi auto_ssh.exp #!/usr/bin/expect   set ipaddress "123.227.159.159" set passwd "你的密码& ...

  5. Ambari概览

    文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/7886195.html  转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点, ...

  6. vagrant扩容

    参考: https://gist.github.com/christopher-hopper/9755310 https://www.madcoder.cn/vagrant-box-resize.ht ...

  7. 企业级Tomcat部署实践及安全调优

    1.1 Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人 ...

  8. node学习笔记(二)(ajax方式向node后台提交数据)

    通过ajax向node后台提交数据过程(附手写前后台代码),并总结post与get的区别 POST 前台代码 //CSS简单给点样式 <style> form{ width: 200px; ...

  9. sklearn 划分数据集。

    1.sklearn.model_selection.train_test_split随机划分训练集和测试集 函数原型: X_train,X_test, y_train, y_test =cross_v ...

  10. 编写带对话框界面的OCX

    编写带对话框界面的OCX步骤: 1.添加Dialog资源,切换到资源视图,将对话框的Style设置为Child,在对话框界面右击添加类,输入类名MyDlg,使得其继承与CDialogEx.(继承CDi ...