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 ...
随机推荐
- nodeCZBK-笔记1
[TOC] ****************************** day01 node简介 Node.js是一个让JavaScript运行在服务器端的开发平台. node就是一个js的执行环境 ...
- AsciidocFX编辑器小贴士
I. AsciidocFX支持UML生成: 要生成UML,记得要下载GRAPHVIZ,并配置GRAPHVIZ_DOT环境变量,路径是Graphviz\bin\dot.exe. II. Asciidoc ...
- C#中消息的工作流程
C#中的消息被Application类从应用程序消息队列中取出,然后分发到消息对应的窗体,窗体对象的第一个响应函数是对象中的protected override void WndProc(ref Sy ...
- 从java1到java9每个版本都有什么新特性?
每次出新版本,大家大概都会这么问,"Java X会有什么特性呢?" .在下面的内容里,我总结了至今为止的Java主要发行版中各自引入的新特性,这样做的目的是为了突出各个新特性是在哪 ...
- pandas基本介绍-【老鱼学pandas】
前面我们学习了numpy,现在我们来学习一下pandas. Python Data Analysis Library 或 pandas 主要用于处理类似excel一样的数据格式,其中有表头.数据序列号 ...
- Linux命令kill和signal
Linux命令kill和signal kill命令用于终止指定的进程(terminate a process),是Unix/Linux下进程管理的常用命令.通常,我们在需要终止某个或某些进程时,先使用 ...
- pandas选择数据-【老鱼学pandas】
选择列 根据列名来选择某列的数据 import pandas as pd import numpy as np dates = pd.date_range("2017-01-08" ...
- 使用webpack配置vue项目代理 (超简单)
我们都知道,前端开发跨域是一个很常见的问题,当然跨域的方法也有很多,现在我就给大家分享一个在vue项目中如何使用webpack做代理,步骤简单,操作方便,本人亲测,巨好使
- linux下expect命令实现批量ssh免密
有时候我们需要批量发送ssh命令给服务器,但是有可能有些服务器是新加入的,还没有配置ssh免密,这个时候就会提示我们输入yes/no 或者password等,expect脚本命令就是用于在提示这些的时 ...
- ligerUI---下拉菜单(menubar)动态显示(从后台获取数据)
写在前面: ligerui的下拉菜单是有点丑的,这也是没有办法的事........这里主要记录下,如何从后台获取数据进行菜单显示. 有两种方式:1.使用json数组来动态添加 2.字符串拼接. 其 ...