首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >容器的aiodocker异步创建

容器的aiodocker异步创建
EN

Stack Overflow用户
提问于 2018-10-31 14:13:29
回答 1查看 780关注 0票数 2

我一直在浏览艾奥克图书馆。

文档显示他们看到了python-asyncio标签。因此,我想问一下如何异步处理我的坞代码,因为我无法从文档和源代码中找到答案。下面是我需要异步的代码(下面的detach=True将不能工作,因为有时容器会以非零状态代码退出。让它们异步将有助于我更好地处理这个问题:

代码语言:javascript
复制
import docker


def synchronous_request(url):
    client = docker.from_env()

    local_dir = '/home/ubuntu/git/docker-scraper/data'
    volumes = {local_dir: {'bind': '/download/', 'mode': 'rw'}}
    environment = {'URL': url}

    client.containers.run('wgettor:latest', auto_remove=True, volumes=volumes, environment=environment)

我使用aiodocker的尝试是:

代码语言:javascript
复制
import aiodocker

async def make_historical_request(url):

    docker = await aiodocker.Docker()
    client = await aiodocker.DockerContainers(docker)

    local_dir = '/home/ubuntu/git/docker-scraper/data'
    volumes = {local_dir: {'bind': '/download/', 'mode': 'rw'}}
    environment = {'URL': url}

    await client.run(config={"auto_remove": "True",
                             "volumes": volumes,
                             "environment": environment}, name="wgettor:latest")

如果你能教我怎么做才好,我会很感激的。

试图实现这样的目标(下面的内容不会同时工作):

代码语言:javascript
复制
import docker
import asyncio
from collections import namedtuple

URL = namedtuple('URL', 'val')

URLs = (
    URL('https://www.google.com'),
    URL('https://www.yahoo.com')
)

client = docker.from_env()
local_dir = '/home/ubuntu/git/docker-scraper/data-test'
volumes = {local_dir: {'bind': '/download/', 'mode': 'rw'}}


async def run_container(client, volumes, environment, *, pid):
    print("Starting the container on pid: {}".format(pid))
    return client.containers.run('wgettor:latest', auto_remove=True, detach=True,
                                 volumes=volumes, environment=environment)


async def make_historical_request(url, *, pid):
    print("Starting the retrieval of: {}, on pid: {}".format(url, pid))
    environment = {'URL': url}
    return await run_container(client, volumes, environment, pid=pid)


async def main():
    tasks = [asyncio.ensure_future(make_historical_request(url.val, pid=ix)) for ix, url in enumerate(URLs)]
    await asyncio.wait(tasks)


if __name__ == '__main__':
    asyncio.run(main())

在弗洛因德·阿莱因德的帮助下,我认为应该是这样的:

代码语言:javascript
复制
async def run_container(docker, url):

    config = {
        'Env': ["URL="+url],
        'HostConfig': {
            'Binds': local_dir + ":" + "/download/"
        }
    }

    try:
        await asyncio.sleep(random.random() * 0.001)
        container = await docker.containers.create_or_replace(
            config=config,
            name="wgettor:latest",
        )
        await container.start()
        await container.kill()
        return url
    except DockerError as err:
        print(f'Error starting wgettor:latest, container: {err}')

async def main():
    start = time.time()
    docker = Docker()
    futures = [run_container(docker, url) for url in URLs]
    # futures = [fetch_async(i) for i in range(1, MAX_CLIENTS + 1)]
    for i, future in enumerate(asyncio.as_completed(futures)):
        result = await future
        print('{} {}'.format(">>" * (i + 1), result))

    print("Process took: {:.2f} seconds".format(time.time() - start))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-01 08:40:06

代码语言:javascript
复制
async def run_container(client, volumes, environment, *, pid):
    print('Starting the container on pid: {}'.format(pid))
    return client.containers.run(..)

这个功能一定要做好等待。

(更新)尝试如下所示:

代码语言:javascript
复制
import aiodocker

async def run_container(docker, name, config):
    try:
        container = await docker.containers.create_or_replace(
            config=config,
            name=name,
        )
        await container.start()
        return container
    except DockerError as err:
        print(f'Error starting {name} container: {err}')

您应该将docker作为

代码语言:javascript
复制
from aiodocker import Docker
docker = Docker()
config = {}
loop.run_until_complete(run_container(docker, ..., config)

在对引擎API进行了一些研究之后,我可以说,如果您想装入某个卷,可以使用这样的配置:

代码语言:javascript
复制
config = {
            'Image': 'imagename',
            'HostConfig': {'Binds':['/local_path:/container_path']},
        }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53085421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档