转载

怎样在Python中操作Docker容器?

来源: EarlGrey    

编程派本文由创业公司DeepGram的CTO Noah Shutty分享。DeepGram开放了自己的API,可以让开发者检索音频和视频文件中的语音信息。免费的开发者账号每月有40个小时的上传额度。

为什么要这样做?

Docker容器在分离不同应用方面做的非常出色,但是如果你想让这些应用之间实现交互呢?例如,你正在开发一款Python应用,而这个应用需要与一个用其他语言开发的应用进行交互。

Python官方百科中提供了一些让Python与其他流行的编程语言进行底层交互的技巧。但是如果你碰到一个很奇怪的情况,或者某个复杂的遗留软件,交互就变得非常困难,甚至是不可能完成。

我们的想法:将容器变成模块

为此,我们创建了sidomo(全称Simple Docker Module,这并不是一个AWS服务)。如果你能让那些棘手的应用在Linux环境下运行起来,你就可以通过sidomo,毫不费力地就在Python中调用这个应用。

目前很多人使用容器Docker Daemon API来管理承载着他们应用的容器。 (Kubernetes / Mesos 就是很好的例子)。 而sidomo则为容器开辟了一条全新的用例——将棘手的软件转换为好用的、原生的Python模块,可以与python程序无缝对接。

sidomo的Github仓库地址:https://github.com/deepgram/sidomo

怎样使用sidomo

确保你的容器正常安装,并且运行了一个容器daemon。如果你不确定是否满足条件,可以运行 docker ps命令, 如果你得到的输出信息为 “CONTAINER ID …”,那就没问题 。假如你还不清楚怎样正确设置docker容器,你可以查看Docker官方文档或者使用谷歌搜索。

一行代码配置Sidomo

你可以用pip直接从git仓库安装sidomo。只需要在终端中输入如下命令:

Python

pip install -e 'git+https://github.com/deepgram/sidomo.git#egg=sidomo'
pipinstall -e 'git+https://github.com/deepgram/sidomo.git#egg=sidomo' 
示例:一个简单的Hello World

这个操作将从ubuntu基础镜像上开启一个容器,运行echo hello from ,然后运行echo the other side,然后从进程中打印输出信息。想要运行这个实例,我们需要使用shell命令将ubuntu镜像pull到你的机器。

shell

# Get the latest Ubuntu image

docker pull ubuntu

Python

Python

from sidomo import Containerwith Container('ubuntu') as c:       for line in c.run('bash -c "echo hello from; echo the other side;"'):         print(line)
from sidomoimport ContainerwithContainer('ubuntu') as c:       for linein c.run('bash -c "echo hello from; echo the other side;"'):         print(line) 

示例: 使用sidomo处理FFMPEG

现在我们来用sidomo做些有用的东西。FFMPEG是一个比较复杂的软件,能高效的处理媒体文件,但是在不同的平台上保持一致的安装却不容易,而且它没有最新的python包。使用sidomo,你可以把FFMPEG 安装在docker上,并用Python运行它。

shell

Python

docker pull cellofellow/ffmpeg
dockerpullcellofellow/ffmpeg 

Python

Python

from sidomo import Container  
from sidomoimport Container   

url =’ http://www2.warwick.ac.uk/fac/soc/sociology/staff/sfuller/media/audio/9_minutes_on_epistemology.mp3′

with Container(

Python

   'cellofellow/ffmpeg',     stdout=False) as c:     for line in c.run(
    'cellofellow/ffmpeg',     stdout=False) as c:     for linein c.run( 

‘bash -c /”/

wget -nv -O tmp.unconverted %s;/

ffmpeg -i tmp.unconverted -f wav -acodec pcm_s16le -ac 1 -ar 16000 tmp.wav;/

cat tmp.wav/

/”/

‘ % url

):

Python

       print line
        print line 

下面的例子将从一个URL抓取音频,将其转码,并打印调试信息以证明它运行成功。我们禁用这个进程的标准输出,因为我们只需要看到调试信息。

如果你需要将此程序转码后的音频数据保存起来,你可以将stdouy=False这一行替换成stderr=False,然后确保将容器进程输出的每一行(裸音频数据)写到文件中。

有趣的可能性

如果你不得不为一些复杂的软件编写Python包,可以考虑将这个软件容器化。通过sidomo,可以毫不费力地将一个容器化的应用变成Python模块。

如果你发现自己经常使用subprocess与一些没有Python包的代码进行交互,那么容器化会使交互更加简单。

如果使用了sidomo的Python应用最后出现了复杂的依赖关系,你或许可以把应用包装一个单独的容器中,然后从外部调用这个应用,这样可以减少依赖关系。sidomo也支持这个功能,因为Docker是可以实现嵌套容器的。你可以使用sidomo不断地导入一层又一层容器,从而创建一个自己的软件俄罗斯套娃。

祝你好运!请记住,你不能无限制地使用容器化来降低复杂度。对吗?

译文参考了开源中国上的版本,并在其基础进行了精校和改善。

原文链接: http://blog.deepgram.com/import-a-docker-container-in-python/

原文  http://dataunion.org/22686.html
正文到此结束
Loading...